У меня есть многопоточное приложение на 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
вызывается из совершенно не связанного потока.