我有一个多线程应用程序,使用 C++ 在 Linux (Fedora 27) 下运行。其中一个线程使用低级 IO(打开、读取等)不断从本地磁盘上的文件中读取数据,并将该数据提供给在其他线程之间循环的缓冲区。
现在,我突然遇到了一个奇怪的问题,即 read() 会在文件的任意偏移处无缘无故地开始无限阻塞。我添加了一个监控线程来检测这个 block (通过在进入 read() 之前设置时间戳)并在它发生时尝试关闭程序。
现在奇怪的是,在主线程结束时,它等待 pthread_join
,然后在那个读取线程上 - 它返回 0(成功)。
我再次尝试,但是用 while(1);
替换了对 read()
的调用,现在,pthread_join
没有完成正如预期的那样。
然后我检查了 gdb 中的程序,令我惊讶的是,当我到达 pthread_join
时,读取的线程消失了!
查看 info thread
当监控线程检测到阻塞时 read()
线程仍然存在,但在某些时候它消失了,我无法捕捉它!
我正试图 catch 这个线程退出,我正在寻找如何做到这一点的想法。我正在使用 pthread_cleanup_push/pop
但我的函数没有被读取线程调用(所有其他线程调用)。
有什么想法吗?我已经无计可施了!
编辑----------------------------------------
它似乎与从完全不相关的线程调用 syslog
有关。
最佳答案
read
是一个取消点,因此如果您的应用程序调用 pthread_cancel
在某个时刻终止线程,线程将不复存在(执行清理操作后) .加入已取消的线程成功,并为 void *
值生成特殊值 PTHREAD_CANCELED
,可选地由 pthread_join
填充。
如果将read
替换为无限循环,则没有取消点,取消请求不被执行,pthread_join
也会无限期等待。
关于c++ - 在 read() 上阻塞时线程 'disappears' 我该如何调试它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55251438/