Как Вы запрашиваете pthread, чтобы видеть, работает ли он все еще?

В моем деструкторе я хочу уничтожить поток чисто.

Моя цель состоит в том, чтобы ожидать потока, чтобы закончить выполниться и ЗАТЕМ уничтожать поток.

Единственной вещью, которую я нашел о запросах состояния pthread, является pthread_attr_setdetachstate, но это только говорит Вам, если Ваш поток:

  • PTHREAD_CREATE_DETACHED
  • PTHREAD_CREATE_JOINABLE

Оба из тех не имеют никакого отношения, работает ли поток все еще или нет.

Как Вы запрашиваете pthread, чтобы видеть, работает ли он все еще?

50
задан Trevor Boyd Smith 28 January 2010 в 07:01
поделиться

3 ответа

Похоже, у вас есть два вопроса:

Как я могу дождаться, пока мою нить не завершится?

Ответ: Это напрямую поддерживается Pthreads - сделать свой поток Будьте перестали присоединяться (когда он сначала запущен), и используйте Pthread_join (), чтобы заблокировать текущий поток, пока не будет завершена нить не остановится.


Как я могу сказать, будет ли моя тема еще работать?

Ответ: Вы можете добавить флаг «Thread_complete», чтобы сделать трюк:

Сценарий: нить A хочет знать, если Threate B все еще жив.

Когда резьба B создается, он дан указатель на адрес флажка «Thread_Complete». Флаг «Thread_Complete» должен быть инициализирован для not_completed, прежде чем поток будет создан. Функция точечной точки входа Thread B должна немедленно вызвать Pthread_cleanup_push (), чтобы нажать «Обработчик очистки», который устанавливает флаг «Thread_Complete» для завершенного.

Смотрите подробную информацию о обработчиках очистки здесь: Handlers Cleanup Pthread

Вы захотите включить соответствующий вызов Pthread_cleAnup_pop (1), чтобы убедиться, что обработчик очистки вызывается независимо от того, что (то есть, если нить выходит нормально Или из-за отмены и т. Д.).

Затем нить A может просто проверить флаг «Thread_Complete», чтобы увидеть, что поток B еще не вышла.

Примечание. Ваш флаг «Thread_Complete» должен быть объявлен «волатильным» и должен быть атомным типом - компиляторы GNU предоставляют SIG_ATOMIC_T для этой цели. Это позволяет двумя потокам постоянным доступом одни и те же данные без необходимости в конструкциях синхронизации (Mutexes / Semaphores).

39
ответ дан 7 November 2019 в 10:58
поделиться

.

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

5
ответ дан 7 November 2019 в 10:58
поделиться

, я думаю все, в чем вы действительно нуждаетесь, должен назвать pthread_join (). Этот вызов не вернется, пока поток не завершит работу.

Если вы хотите только провести опрос, чтобы узнать, работает ли поток или нет (и обратите внимание, что это обычно не то, что вы должны хотеть сделать!), вы можете установить для потока изменчивое логическое значение false непосредственно перед его выходом... тогда главный поток может считывать логическое значение, и если оно остается верным, вы знаете, что поток все еще выполняется. (если это ложь,с другой стороны, вы знаете, что нить, по крайней мере, почти исчезла; возможно, он все еще запускает код очистки, который происходит после того, как он устанавливает логическое значение false, поэтому даже в этом случае вы все равно должны позвонить pthread_join, прежде чем пытаться освободить любые ресурсы, к которым поток может иметь доступ)

8
ответ дан 7 November 2019 в 10:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: