Boost线程错误

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();
     }
   };

然而,在我的测试程序中无法重现此问题(尽管在实际程序中每次都会出现该问题)。


1
调试程序,并在问题引用的代码上设置断点。它似乎应该每个线程调用一次,因此第二次调用应该可以确定您的问题。 - Steve Townsend
4
成功的加入表示线程已经执行完毕。如果要再次执行,您需要创建另一个线程。 - Jerry Coffin
你使用的是哪个平台/编译器和boost版本? - Vicente Botet Escriba
1个回答

0

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

当然,我可能是错的。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接