boost :: this_thread :: get_id在exit()调用期间没有返回id

时间:2011-11-25 11:29:50

标签: c++ multithreading boost boost-thread

我有一个相当简单的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,可能是因为此时它已经被破坏了?

2 个答案:

答案 0 :(得分:1)

你不应该在一个帖子中调用exit!此函数退出整个过程而不仅仅是线程。只需从线程函数返回。

答案 1 :(得分:1)

exit(0)强制所有线程退出。调用m_thread时,m_thread.get_id()引用的线程可能已被销毁。