8

私は簡単なプログラムを持っています。

int main() 
{
    std::atomic<bool> b = true;
    ConcurrentQueue<std::string> queue;

    std::thread thread( [&]{
        while ( b ) {
            auto str = queue.wait_and_pop();
            std::cout << *str;
        }
    });

    b = false;
    queue.push( "end" );
    thread.join();
}

ConcurrentQueue<T>はスレッド セーフ キューの私自身の実装であり、wait_and_popは を使用するブロッキング操作ですstd::condition_variable

このプログラムは "end" を正常に出力して終了します。ここでは問題ありません。b(開始時に falsethreadであり、すぐに終了するバグがありますが、ここでは関係ありません)

しかし、これらすべてをクラスにラップすると

class object {
public:
    object() {
        b = true;

        thread = std::thread( [this]{
            while ( b ) {
                auto str = queue.wait_and_pop();
                std::cout << *str;
            }
        });
    }

    ~object() {
        b = false;
        queue.push( "end" );
        thread.join();
    }

private:
    std::atomic<bool> b;
    std::thread thread;
    ConcurrentQueue<std::string> queue;
};

そして、次のような関数静的変数を持っています

object & func() {
  static object o;
  return o;
}

そしてメイン

int main() {
    object & o = func();
}

現在、プログラムは「end」を出力し、oat lineのデストラクタでスタックしていthread.join()ます。

これをclangでテストしましたが、問題ありません。これは VC11 でのみ発生するようです。何故ですか?

4

1 に答える 1

5

最近同じ問題のスレッドがありましたが、もう見つかりません。

基本的に、デストラクタでスレッドを終了しようとする静的な有効期間オブジェクトがある場合、VS のランタイム ライブラリにデッドロックが発生します。

于 2013-06-21T16:20:41.360 に答える