c++ - 在 read() 上阻塞时线程 'disappears' 我该如何调试它?

标签 c++ c linux multithreading pthreads

我有一个多线程应用程序,使用 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/

相关文章:

linux - 如何映射由 get_user_pages_fast 固定的页面以将它们用作驱动程序中的虚拟连续缓冲区?

c++ - 降低构建大小

c++ - obj 文件中纹理坐标的含义是什么

c++ - 为 VS 2010 (MSVC 10) 编译的 libcurl 二进制文件

c - 从另一个结构体访问结构体中的元素

linux - 有没有合理的方法将新路径附加到 bashrc 中的 PATH?

linux - 如何使用 bash 在 linux 中用空格替换 csv 文件中的第三个逗号?

c++ - 无法将 QPushButton 信号连接到 QGraphicsView 插槽

c++ - c++最基本的上网方式是什么?

c - Pthreads:我的并行代码在达到一定数量后不会将线程传递到函数中