Как определить, жив ли pthread?
Как определить, жив ли отсоединенный pthread?
У меня есть канал связи с потоком (однонаправленная очередь, направленная наружу от потока), но что произойдет, если нить умирает без вздоха?
Должен ли я смириться с использованием сигналов процесса или я могу каким-то образом определить для оживления потоков?
Ответы
Ответ 1
Вы можете использовать pthread_kill следующим образом:
int ret = pthread_kill(YOUR_PTHREAD_ID, 0);
Если вы получаете значение ESRCH, может быть, ваш поток мертв.
ОБНОВЛЕНИЕ: по-видимому, мой ответ неверен. Я не могу удалить его, так как это принятый ответ.
Из комментариев:
Ответ неверен, потому что если поток отсоединен и не является живой, pthread_t недействителен. Вы не можете передать его pthread_kill. Это может, например, быть указателем на структуру, которая была освобождена, в результате чего ваша программа выйдет из строя. POSIX говорит: "Соответствующий реализация может повторно использовать идентификатор потока после его срока службы закончился. Если приложение пытается использовать идентификатор потока, чье время жизни закончилось, поведение undefined." - Спасибо @DavidSchwartz
Ответ 2
Этот вопрос предполагает конструкцию с неизбежным состоянием гонки.
Предположительно, вы планируете сделать что-то вроде этого:
- Проверьте, жив ли поток
- Ожидание сообщения из потока
Проблема состоит в том, что эта последовательность не является атомарной и не может быть исправлена. В частности, что, если поток, который вы проверяете, умирает между шагом (1) и шагом (2)?
Условия гонки - это зло; редкий раса условия вдвойне. Бумага над чем-то 90% надежным с чем-то 99.999% надежным является одним из худших решений, которые вы можете сделать.
Правильный ответ на ваш вопрос - "не делай этого". Вместо этого исправьте приложение так, чтобы потоки не умирали случайным образом.
Если это невозможно, и какой-то поток склонен к сбою, и вам нужно оправиться от этого... Тогда ваш дизайн в корне ошибочен, и вы не должны использовать нить. Поместите эту ненадежную вещь в другой процесс и используйте трубку, чтобы общаться с ней вместо этого. Процесс смерти закрывает файловые дескрипторы и считывает трубку, другой конец которой закрыт, имеет четко определенное, легко обнаруживаемое поведение без гонки.
Ответ 3
Это, вероятно, поведение undefined при отправке сигнала в уже мертвый поток. Может произойти сбой приложения.
см. http://sourceware.org/bugzilla/show_bug.cgi?id=4509 и http://udrepper.livejournal.com/16844.html