Для многопоточной программы, если один поток умирает, как вы можете это знать?

#linux #multithreading #unix #thread-safety #pthreads

#linux #многопоточность #unix #безопасность потоков #pthreads

Вопрос:

Для многопоточной программы, если один поток умирает, как вы можете это знать?

Моя идея:

(1) используйте ps для проверки LWP, но это вручную, неэффективно. (2) установите try-catch в каждом потоке, если он завершается ненормально, перехватите его. (3) пусть умирающий поток отправляет сообщение в std::cout или основной поток.

Другие лучшие идеи?

Спасибо

Ответ №1:

Вы могли бы использовать pthread_cleanup_push(3) на очень ранней стадии функцию потока. Данная функция pthread_cleanup_push может установить некоторый флаг, который может получить поток «наблюдателя». pthread_cleanup_push также соблюдается pthread_exit и не привязывается к исключениям.

Редактировать: второй способ сделать это: использовать pthread_key_create(3) с функцией деструктора и вызывать pthread_setspecific(3) в начале функции потока. Функция деструктора может сигнализировать наблюдающему потоку о его неизбежной смерти.

Ответ №2:

Вы могли бы просто использовать pthread_cleanup_push и pthread_cleanup_pop для выполнения обработчика очистки при выходе из потока. Это приведет к перехвату событий отмены / pthread_exit.