マイヤーズ シングルトン内でブースト スレッドを実行しています。私のプログラムの期間中は喜んで実行されます。
シングルトンのデストラクタが呼び出されたとき (プログラムがメモリからロードされたとき) にフラグを設定して、スレッドがループを終了し、への呼び出しを開始するようにしthread.join()
ます。
現在、Windows では、呼び出しthread.join()
によって不正なアクセス例外が発生します。しかし、Mac では、呼び出さないthread.join()
と不正なアクセス例外がスローされます!
これら 2 つのオペレーティング システム間のこの動作の違いに光を当てたり、スレッドを安全に終了する方法を説明したりできますか?
編集: このコードは、単純なコマンド ライン アプリケーションで実行すると、Mac と Windows の両方で機能します。電話してもしなくても構いませmyThread.join()
ん!
共有ライブラリとして実行すると問題が発生します... dylib をもう一度再読み込みしようとすると、Mac でメモリ例外が発生し、への呼び出しを省略しますmyThread.join()
。
例:
#include "boost/thread.hpp"
class MeyersSingleton
{
public:
MeyersSingleton()
: threadShouldExit(false),
myThread(boost::ref(*this) ) {
}
~MeyersSingleton() {
threadShouldExit = true;
myThread.join();
}
static MeyersSingleton& getInstance() {
static MeyersSingleton singletonInstance;
return singletonInstance;
}
void operator()() {
while(!threadShouldExit) {
// my busy worker thread...
sleep(1);
}
}
private:
bool threadShouldExit;
boost::thread myThread;
};