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

Как определить, жив ли pthread?

Как определить, жив ли отсоединенный pthread?

У меня есть канал связи с потоком (однонаправленная очередь, направленная наружу от потока), но что произойдет, если нить умирает без вздоха?

Должен ли я смириться с использованием сигналов процесса или я могу каким-то образом определить для оживления потоков?

4b9b3361

Ответ 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% надежным является одним из худших решений, которые вы можете сделать.

Правильный ответ на ваш вопрос - "не делай этого". Вместо этого исправьте приложение так, чтобы потоки не умирали случайным образом.

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