#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.