ブーストスレッドを使用するプログラムがあります。プログラムには、開始および停止機能があります。プログラムが開始されると、何らかの処理を行うブースト スレッドを作成します。プログラムが停止したら、このスレッドで 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();
}
};
ただし、テスト プログラムでこの問題を再現するのに問題があります (実際のプログラムでは毎回発生しますが)。