main: return 0 挂起,exit 0 关闭。如何调试?
main: return 0 hangs, exit 0 closes. How to debug?
我有一个程序生成三个线程,在它们之间进行一些通信,然后关闭它们。主线程等待最后一个线程关闭,然后调用return 0
。
但由于某些奇怪的原因,我的程序没有关闭,而是在使用 return 0
退出时挂起,但是它使用 exit(0)
正常关闭。我已经检查过线程是否真的关闭了,我什至通过发出 pthread_kill(pid, 0)
强制它们关闭。我也试过 valgrind 来寻找泄漏的内存。
据我所知,exit()
唯一没有做的就是调用局部作用域的非静态对象的析构函数,但我的主函数中没有析构函数,也无法解释它挂起的原因。
是什么导致了这种行为?我该如何调试它?
代码:
- main.cpp: http://pastebin.com/7aN9KA6T
- publisher.hpp: http://pastebin.com/Vhz1FKau
- publisher.cpp: http://pastebin.com/09nh5YBs
- boxoffice.hpp: http://pastebin.com/kaEbgNMJ
- boxoffice.cpp: http://pastebin.com/wafaVcGV
您需要在返回之前加入您的每个线程。
bo_thread.join();
pub_thread.join();
sub_thread.join();
此外,pthread_kill(pid, 0)
您使用它的方式有两个问题。
- 它需要一个
pthread_t
类型,而不是 pid。这可以通过 boost::thread::native_handle 访问
- 调用它实际上 'kill' 线程。它的作用取决于第二个参数。对于 0,它只会检查它们是否为 运行。请在此处查看手册页:http://man7.org/linux/man-pages/man3/pthread_kill.3.html
我有一个程序生成三个线程,在它们之间进行一些通信,然后关闭它们。主线程等待最后一个线程关闭,然后调用return 0
。
但由于某些奇怪的原因,我的程序没有关闭,而是在使用 return 0
退出时挂起,但是它使用 exit(0)
正常关闭。我已经检查过线程是否真的关闭了,我什至通过发出 pthread_kill(pid, 0)
强制它们关闭。我也试过 valgrind 来寻找泄漏的内存。
据我所知,exit()
唯一没有做的就是调用局部作用域的非静态对象的析构函数,但我的主函数中没有析构函数,也无法解释它挂起的原因。
是什么导致了这种行为?我该如何调试它?
代码:
- main.cpp: http://pastebin.com/7aN9KA6T
- publisher.hpp: http://pastebin.com/Vhz1FKau
- publisher.cpp: http://pastebin.com/09nh5YBs
- boxoffice.hpp: http://pastebin.com/kaEbgNMJ
- boxoffice.cpp: http://pastebin.com/wafaVcGV
您需要在返回之前加入您的每个线程。
bo_thread.join();
pub_thread.join();
sub_thread.join();
此外,pthread_kill(pid, 0)
您使用它的方式有两个问题。
- 它需要一个
pthread_t
类型,而不是 pid。这可以通过 boost::thread::native_handle 访问
- 调用它实际上 'kill' 线程。它的作用取决于第二个参数。对于 0,它只会检查它们是否为 运行。请在此处查看手册页:http://man7.org/linux/man-pages/man3/pthread_kill.3.html