我有一个使用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.
我知道我的连接工作正常,因为当处理线程退出时我向我的控制台输出一条消息。有谁知道为什么会发生这种情况?
额外注意事项......我已经玩了一些我的代码,我用来清理我的提升线程的方法似乎在我的程序的其他部分工作(例如,如果我创建了提升::父类中的线程)。但是,它每次都在子类(这是一个抽象类)中失败。
我的启动和停止方法看起来像这样......
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();
}
};
但是,我在测试程序中重新创建此问题时遇到了问题(尽管每次在我的实际程序中都会出现这种情况)。
答案 0 :(得分:0)
错误可能是Boost.Thread上的错误,因为call_once实现中存在一些漏洞(#5752 boost :: call_once()在某些平台上不可靠 - 请参阅https://svn.boost.org/trac/boost/ticket/5752)。这当然取决于您运行程序的平台。
当然我可能错了。
您还应该保护对_runningThread的访问权限。