exponenta event banner

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

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

Описание

Этот дефект возникает при использовании непотушенного сигнала для уничтожения потока. Например, используется функция 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