exponenta event banner

Use of signal to kill thread

Незакрытый сигнал убивает весь процесс вместо определенного потока

Описание

Этот дефект возникает, когда вы используете неотключенный сигнал, чтобы убить поток. Например, вы используете POSIX® функциональные pthread_kill и отправьте сигнал SIGTERM чтобы убить нить.

Риск

Отправка сигнала убивает весь процесс вместо того, чтобы просто нить, которую вы намереваетесь убить.

Для образца, pthread_kill спецификации показывают, что, если расположение сигнала должно завершиться, это действие влияет на весь процесс.

Зафиксировать

Используйте другие механизмы, которые предназначены для уничтожения определенных потоков.

Например, используйте функцию POSIX pthread_cancel для завершения определенного потока.

Примеры

расширить все

#include <signal.h>
#include <pthread.h>

void* func(void *foo) {
  /* Execution of thread */
}
 
int main(void) {
  int result;
  pthread_t thread;
 
  if ((result = pthread_create(&thread, NULL, func, 0)) != 0) {
  }
  if ((result = pthread_kill(thread, SIGTERM)) != 0) {
  }
 
  /* This point is not reached because the process terminates in pthread_kill() */
 
  return 0;
}

В этом примере pthread_kill функция отправляет сигнал SIGTERM чтобы убить нить. Сигнал убивает весь процесс вместо потока, ранее созданного с pthread_create.

Коррекция - Использование pthread_cancel Завершение потоков

Одной из возможных коррекций является использование pthread_cancel функция. The pthread_cancel завершает поток, заданный его первым аргументом, в определенной точке отмены или немедленно, в зависимости от типа отмены потока.

#include <signal.h>
#include <pthread.h>

void* func(void *foo) {
  /* Execution of thread */
}
 
int main(void) {
  int result;
  pthread_t thread;
 
  if ((result = pthread_create(&thread, NULL, func, 0)) != 0) {
    /* Handle Error */
  }
  if ((result = pthread_cancel(thread)) != 0) {
    /* Handle Error */
  }
 
  /* Continue executing */
 
  return 0;
}

См. также:

  • pthread_cancel для получения дополнительной информации о типах отмены.

  • Pthreads для функций, которые могут быть точками отмены.

Информация о результатах

Группа: Параллелизм
Язык: C | C++
По умолчанию: Off
Синтаксис командной строки : THREAD_KILLED_WITH_SIGNAL
Влияние: Низкое
Введенный в R2018b