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