2

マイヤーズ シングルトン内でブースト スレッドを実行しています。私のプログラムの期間中は喜んで実行されます。

シングルトンのデストラクタが呼び出されたとき (プログラムがメモリからロードされたとき) にフラグを設定して、スレッドがループを終了し、への呼び出しを開始するようにし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;
};
4

1 に答える 1