1. ホーム
  2. c++

[解決済み] スレッド間で共有変数を変更するコードは、なぜレースコンディションに陥らないのでしょうか?

2022-11-19 23:41:47

質問

CygwinのGCCを使用して、このコードを実行しています。

#include <iostream>
#include <thread>
#include <vector>
using namespace std;

unsigned u = 0;

void foo()
{
    u++;
}

int main()
{
    vector<thread> threads;
    for(int i = 0; i < 1000; i++) {
        threads.push_back (thread (foo));
    }
    for (auto& t : threads) t.join();

    cout << u << endl;
    return 0;
}

行でコンパイルします。 g++ -Wall -fexceptions -g -std=c++14 -c main.cpp -o main.o .

1000と表示され、これは正しいです。しかし、私は、スレッドが以前に増分された値を上書きするため、より少ない数を期待しました。なぜこのコードは相互アクセスに悩まされないのでしょうか?

私のテスト マシンは 4 コアで、私が知っている限りプログラムには何の制限も加えていません。

この問題は、共有の foo をより複雑なもの、例えば

if (u % 3 == 0) {
    u += 4;
} else {
    u -= 1;
}

どのように解決するのですか?

foo() は非常に短いので、各スレッドはおそらく次のスレッドが起動される前に終了します。もし、ランダムな時間のスリープを foo() の前に u++ の前に記述すると、期待通りの結果が得られるかもしれません。