提升线程错误

时间:2012-05-07 16:06:30

标签: c++ boost-thread

我有一个使用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();
     }
   };

但是,我在测试程序中重新创建此问题时遇到了问题(尽管每次在我的实际程序中都会出现这种情况)。

1 个答案:

答案 0 :(得分:0)

错误可能是Boost.Thread上的错误,因为call_once实现中存在一些漏洞(#5752 boost :: call_once()在某些平台上不可靠 - 请参阅https://svn.boost.org/trac/boost/ticket/5752)。这当然取决于您运行程序的平台。

当然我可能错了。

您还应该保护对_runningThread的访问权限。