Вам нужно присоединиться к отмененной теме?(Pthreads) - PullRequest
5 голосов
/ 23 января 2012

Меня немного смущает порядок очистки, когда вы используете PThreads в отношении отмены. Обычно, если ваш поток отсоединен, он автоматически очищается после завершения. Если он не отсоединен, вам необходимо присоединиться к нему, чтобы восстановить системные ресурсы.

В учебнике, который я читаю, говорится следующее, что странно звучит как присоединение, необязательно в отношении отмены:

"Если вам нужно знать, когда поток фактически завершился, вы должны присоединитесь к нему, вызвав pthread_join после его отмены. "

Итак, нужно ли мне присоединяться к отмененному потоку, чтобы освободить его ресурсы - и если нет, то почему?

Ответы [ 5 ]

6 голосов
/ 23 января 2012

TLPI говорит следующее:

При получении запроса на отмену поток, возможность отмены которого включена и отложена, завершается, когда он в следующий раз достигает точки отмены.Если поток не был отсоединен, к нему должен присоединиться какой-то другой поток в процессе, чтобы не позволил ему стать потоком зомби .

Кроме того, так как отменапоток обычно не делается сразу (подробнее о «точках отмены»), не присоединяясь, вы не можете быть уверены, что поток был фактически отменен.

3 голосов
/ 23 января 2012

С man pthread_join:

После завершения отмененного потока, соединение с этим потоком, используя pthread_join (3) получает PTHREAD_CANCELED в качестве состояния выхода потока. (Присоединение к ветке - единственный способ узнать, что отмена завершено.)

Кажется, что объединение не обязательно для выполнения, оно необходимо, если вы хотите знать, что вы на самом деле добились успеха.

1 голос
/ 23 января 2012

Поток, использующий pthread, может иметь следующие состояния отмены:

 PTHREAD_CANCEL_ENABLE
 PTHREAD_CANCEL_DISABLE

Если вы пытаетесь отменить поток, вы не на 100% знаете, действительно ли поток будет отменен.Использование объединения предоставляет вам информацию, если поток действительно был отменен или нет.Есть также типы отмены, которые необходимо учитывать, и соответствующие функции pthread для установки типа и состояния отмены:

 int pthread_setcancelstate (int state, int *oldstate);
 int pthread_setcanceltype  (int type,  int *oldtype);

Вот пример кода, заимствованного из http://www.ijon.de/comp/tutorials/threads/cancel.html

РЕДАКТИРОВАТЬ: Либо яслишком глуп, чтобы опубликовать несколько строк кода, или форматер действительно сегодня действует мне на нервы.Просто посмотрите код по ссылке выше, пожалуйста.

1 голос
/ 23 января 2012

С Документация из pthread_cancel():

После завершения отмененного потока соединение с этим потоком с помощью pthread_join (3) получает PTHREAD_CANCELEDкак состояние выхода потока.(Присоединение к ветке - единственный способ узнать, что отмена завершена.)

0 голосов
/ 23 января 2012

Если что-то пойдет не так в потоке или если оно каким-то образом остановлено, оно всегда будет исправлено операционной системой.Так что все красиво и безопасно.

Вам нужно присоединиться к потоку, только если вы хотите быть уверены, что он фактически прекратил выполнение, например, объединение двух параллельных задач.(Например, если у вас есть разные потоки, работающие над разными частями в разделенной структуре, вам нужно объединить их все, как в ожидании, пока они все не будут завершены, когда вы захотите снова объединить структуру)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...