3

ブーストスレッドを使用するプログラムがあります。プログラムには、開始および停止機能があります。プログラムが開始されると、何らかの処理を行うブースト スレッドを作成します。プログラムが停止したら、このスレッドで join を呼び出し、スレッドのポインターを削除します。私のプログラムは、最初は正しく開始および停止します。ただし、プログラムをもう一度開始しようとすると、ブースト内でアサーションが失敗し (処理スレッドを新しくするとき)、画面に次のように出力されます。

/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::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

call_once 実装にいくつかの穴があるため、エラーは Boost.Thread のバグである可能性があります (#5752 boost::call_once() は一部のプラットフォームでは信頼できません - https://svn.boost.org/trac/boost/ticketを参照してください)。 /5752 )。もちろん、これはプログラムを実行しているプラ​​ットフォームによって異なります。

もちろん、私は間違っているかもしれません。

_runningThread へのアクセスも保護する必要があります。

于 2012-12-15T12:02:19.033 に答える