我有一个使用boost线程的程序。该程序具有启动和停止功能。当程序启动时,我创建了一个执行一些处理的boost线程。当程序停止时,我调用该线程上的join并删除该线程的指针。我的程序第一次启动和停止都正确;然而,当我尝试第二次启动程序时,在boost内部(在新建处理线程时)失败了一个断言,并且以下内容输出在我的屏幕上:
/root/src/boost.cmake/libs/thread/src/pthread/once.cpp:46: unsigned long &boost::detail::get_once_per_thread_epoch(): Assertion`!pthread_setspecific(epoch_tss_key,data)' failed.
我知道我的连接正常工作,因为当处理线程退出时,我会在控制台输出一条消息。有人知道这可能是为什么吗?
另外需要注意的是,我已经对代码进行了一些调整,并且我用来清理boost线程的方法似乎在程序的其他部分(例如,如果我在父类中创建boost::thread)中有效。然而,在子类中(这是一个抽象类),它每次都失败。
我的开始和停止方法如下...
void ThreadMethod()
{
while(_runningThread)
{
}
}
void Start()
{
_runningThread = true;
_thread = boost::make_shared<boost::thread>(&TestChildVirtualClass::ThreadMethod, this);
};
void Stop()
{
_runningThread = false;
_thread->join();
if( _thread )
{
_thread.reset();
}
};
然而,在我的测试程序中无法重现此问题(尽管在实际程序中每次都会出现该问题)。