Использование сигнала для уничтожения нити

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

Описание

Этот дефект возникает при использовании непотушенного сигнала для уничтожения потока. Например, используется функция 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 функция. 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++
По умолчанию: Откл.
Синтаксис командной строки: THREAD_KILLED_WITH_SIGNAL
Воздействие: Низкий
Представлен в R2018b