Подтвердить что ты не робот

Для pthread, Как убить дочерний поток из основного потока

Я использую pthread_create для создания нескольких дочерних потоков. В то время основной поток хочет убить все дочерние потоки или будет сегмент falut. Какую функцию я должен использовать, чтобы закончить это? Я искал ответ из google и получил функцию pthread_kill. Но я не знал, какой сигнал я должен отправить в дочерний поток, чтобы убить их. Моя рабочая среда - RHEL 5.4, а язык программирования - C.

4b9b3361

Ответ 1

Можно "отменить" поток, используя pthread_cancel. Однако это обычно не самая лучшая практика, хотя в экстремальных обстоятельствах, таких как SEGFAULT, это может быть разумным подход.

Ответ 2

В общем, вы действительно не хотите насильственно убивать дочерний поток, но вместо этого вы хотите попросить его закончить. Таким образом, вы можете быть уверены, что ребенок уходит в безопасном месте, и все его ресурсы очищаются.

Я обычно делаю это с небольшой частью общего состояния между родителем и дочерним, чтобы позволить родительскому сообщать "запрос на выход" каждому ребенку. Это может быть просто логическое значение для каждого дочернего элемента, защищенного мьютексом. Ребенок периодически проверяет это значение (каждая итерация цикла или любые удобные контрольные точки, которые у вас есть в дочернем потоке). Когда "quit_request" будет истинным, дочерний поток очистится и вызовет pthread_exit.

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

acquire shared mutex
set quit_request to true 
pthread_join the child 

pthread_join может занять некоторое время, в зависимости от того, как часто ребенок проверяет свой запрос на выход. Убедитесь, что ваш дизайн может работать независимо от задержки.

Ответ 3

Вы должны отправить SIG_TERM в каждый из ваших потоков, используя

  int pthread_kill(pthread_t thread, int sig);

Быстрый способ избавиться от всех потоков (кроме основного) - это fork() и продолжать перемещаться с ребенком.
Не гипер чистый...

  if (fork()) exit(0); // deals also with -1...

Ответ 4

Вы можете использовать глобальную переменную для всей программы.

int _fCloseThreads;

Установите значение 1, когда вы хотите, чтобы потоки завершили выполнение. Попросите потоки проверить эту переменную в своем "цикле" и красиво выйти, когда она установлена ​​в 1. Нет необходимости защищать ее с помощью мьютекса.

Вам нужно подождать, пока потоки перестанут работать. Вы можете использовать соединение. Другой способ - увеличить счетчик, когда поток входит в поток потока, а затем уменьшает счетчик, когда он выходит. Счетчик должен быть глобальным. Используйте gcc atom ops на счетчике. Основной поток, после установки fCloseThreads, может ждать на счетчике, чтобы перейти к нулю путем циклирования, спящего и проверки счета.

Наконец, вы можете проверить pthread_cleanup_push и поп. Они являются моделью, позволяющей нить отменить в любом месте своего кода (использует longjump), а затем вызывать окончательную функцию очистки до выхода из threadproc. Вы в основном ставите cleanup_push в верхней части потока threadproc и cleanup_pop внизу, создаете функцию размотки, а затем в определенных точках отмены поток, отмененный вызовом pthread_cancel(), будет longjump обратно в threadproc и вызовет функцию размотки.