我有一个相当简单的C ++应用程序,其中包含几个线程 - 主线程和工作线程。工作线程等待通过网络发送的数据包,并在收到断开连接时,调用exit(0)。
这会导致负责该线程的类的析构函数运行。这个析构函数通常从主线程运行,并导致工作线程(如果正在运行)停止,然后调用join以等待它停止。这是析构函数的代码:
if( m_thread.get_id() == boost::this_thread::get_id() )
{
return;
}
if ( m_thread.joinable() )
{
m_runThread = false;
m_thread.join();
}
我的问题是,该行
if( m_thread.get_id() == boost::this_thread::get_id() )
返回false,即使我从调试中可以看出这段代码肯定是在m_thread引用的线程上运行的。
进一步研究一下,boost :: this_thread :: get_id()此时返回id为0。但是,visual studio调试器和win32 API函数GetCurrentThreadId仍然能够正确识别线程ID。
有人可以为此提供解释吗?应用程序关闭期间是否正确支持boost :: this_thread,可能是因为此时它已经被破坏了?
答案 0 :(得分:1)
你不应该在一个帖子中调用exit
!此函数退出整个过程而不仅仅是线程。只需从线程函数返回。
答案 1 :(得分:1)
exit(0)
强制所有线程退出。调用m_thread
时,m_thread.get_id()
引用的线程可能已被销毁。