1

このようなプログラムがあります。

#include <iostream>
#include <thread>
#include <mutex>

using namespace std;

template<int Thread>
void run()
{
    for(int j=0;j<5;++j)
    {
        static std::mutex m;
        m.lock();
        cout<<"Thread "<<Thread<<" running... "<<j<<endl;
        m.unlock();

        std::this_thread::sleep_for(std::chrono::milliseconds(10));
    }
}

int main(int argc , char * argv [])
{
    std::thread t1(run<1>);
    std::thread t2(run<2>);

    t1.join();
    t2.join();

    return 0;
}

排他的に実行されるrun()ことを確認するための staic ミューテックスがあります。coutただし、このプログラムを Visual Studio 2012 で実行すると、出力は次のようになります。

Thread Thread 2 running... 01
 running... 0
Thread 1 running... 1
Thread 2 running... 1
Thread 1 running... 2
Thread 2 running... 2
Thread 2 running... 3
Thread 1 running... 3
Thread 1 running... 4
Thread 2 running... 4

の最初のループでミューテックスが期待どおりに機能していないようrun()です。プログラムに何か問題がありましたか?

4

4 に答える 4

3

あなたが直面している問題は、あなたの関数がテンプレートなどrun<1>run<2>あり、同じものではなく、同じ静的オブジェクトを共有していないという事実から来ています。

解決策は、スレッド番号を引数として関数に渡すことです。

于 2012-12-26T12:19:13.730 に答える
2

次の行を配置する必要があります。

static std::mutex m;

の体外run()。たとえば、 と同じレベルでグローバルに宣言しますrun()

テンプレートを使用しているため、2 つの異なるrun()関数が構築され、それぞれに独自のミューテックスがmあり、互いに見えません。

于 2012-12-26T12:19:38.830 に答える
1

テンプレートのインスタンス化ごとに異なるミューテックスがあります。ミューテックスをグローバル変数にするか、テンプレートから生成された各関数で同じものを使用するように手配する必要があります。

于 2012-12-26T12:19:50.937 に答える
1

これは std::mutex の問題ではありません。run 関数は 2 つの静的ミューテックスを宣言し、スレッドごとに 1 つをロックします。

ミューテックスを宣言しmainてパラメーターとして関数に渡すか、グローバルに宣言して実行関数でロックするか、実行関数を非テンプレート関数にすることを検討してください。

于 2012-12-26T12:21:51.170 に答える