3

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

但是,我在测试程序中重新创建此问题时遇到了麻烦(尽管它在我的实际程序中每次都会发生)。

4

1 回答 1

0

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

当然我可能错了。

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

于 2012-12-15T12:02:19.033 回答