我有一个使用 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();
}
};
但是,我在测试程序中重新创建此问题时遇到了麻烦(尽管它在我的实际程序中每次都会发生)。