c++ - main : return 0 hangs, exit 0 关闭。如何调试?

标签 c++ multithreading debugging return exit

我有一个程序生成三个线程,在它们之间进行一些通信,然后关闭它们。主线程等待最后一个线程关闭,然后调用return 0

但由于某些奇怪的原因,我的程序没有关闭,而是在使用 return 0 退出时挂起,但是它可以使用 exit(0) 正常关闭。我已经检查过线程是否真的关闭了,我什至通过发出 pthread_kill(pid, 0) 强制它们关闭。我也试过 valgrind 来寻找泄漏的内存。

据我所知,exit() 唯一没有做的就是调用局部作用域的非静态对象的析构函数,但我的主函数中没有,也不能解释为什么它挂起。

是什么导致了这种行为?我该如何调试它?

代码:

最佳答案

您需要在返回之前加入您的每个线程。

bo_thread.join();
pub_thread.join();
sub_thread.join();

此外,pthread_kill(pid, 0) 您使用它的方式有两个问题。

  1. 它采用pthread_t 类型,而不是pid。这可以通过 boost::thread::native_handle 访问
  2. 调用它实际上并没有“杀死”线程。它的作用取决于第二个参数。使用 0,它只会检查它们是否正在运行。请在此处查看手册页:http://man7.org/linux/man-pages/man3/pthread_kill.3.html

关于c++ - main : return 0 hangs, exit 0 关闭。如何调试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28774838/

相关文章:

c++ - 如何将 "pointer to pointer type"转换为常量?

java - 如何使用 Java 检测同步冲突

java - 线程run()函数调用

c# - 在 C# 中杀死一个线程

c# - 变量未声明或从未分配?和数据读取器不工作?

c++ - 逐字比较字符串 C++

c++ - 将字节数组复制到未对齐的结构

c++ - 如何远程调试 Mac 桌面应用程序

c++ - 给定一个带有 UnhandledExceptionFilter 的调用堆栈,导致我的应用程序崩溃的异常是什么?

c++ - 为宏做 {} while(false) 的替代方法