поток 'исчезает' при блокировке чтения (), как мне его отладить? - PullRequest
0 голосов
/ 20 марта 2019

У меня есть многопоточное приложение на C ++, работающее под Linux (Fedora 27).Один из потоков продолжает чтение данных из файла на локальном диске с помощью низкоуровневого ввода-вывода (открытие, чтение и т. Д.) И передает эти данные в буфер, который вращается между другими потоками.

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

Странная вещь в том, что в концеВ основном потоке он ждет pthread_join, а в этом потоке чтения - возвращает 0 (успех).

Я попробовал еще раз, но заменил вызов на read() на while(1); и теперь pthread_join не заканчивается должным образом.

Затем я изучил программу в gdb, и, к моему удивлению, когда я достигаю pthread_join, поток чтения пропал!

Просмотр info thread когда поток монитора обнаруживает блокировку read() поток все еще там, но в какой-то момент он исчезает, и я не могу его поймать!

Я пытаюсь поймать этот поток, выходящий, и я 'ищу идеи как это сделать.Я использую pthread_cleanup_push/pop, но моя функция не вызывается потоком чтения (все остальные темы).

Есть идеи?я в своем уме!

edit ----------------------------------------

, похоже, что-то связано с тем, что syslog вызывается из совершенно не связанного потока.

1 Ответ

1 голос
/ 20 марта 2019

read является точкой отмены, поэтому, если ваше приложение вызывает pthread_cancel, чтобы прекратить поток в какой-то момент, поток перестанет существовать (после выполнения действий очистки). Присоединение к отмененному потоку завершается успешно и выдает специальное значение PTHREAD_CANCELED для значения void *, необязательно заполненного pthread_join.

Если вы замените read бесконечным циклом, то точка отмены отсутствует, запрос на отмену не обрабатывается, и pthread_join также будет ждать бесконечно.

...