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

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

Описание

Использование сигнала уничтожить поток происходит, когда вы используете непойманный сигнал уничтожить поток. Например, вы используете функцию 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++
Значение по умолчанию: 'off'
Синтаксис командной строки: THREAD_KILLED_WITH_SIGNAL
Влияние: низко

Введенный в R2018b