[解決済み] スレッド間で共有変数を変更するコードは、なぜレースコンディションに陥らないのでしょうか?
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++
の前に記述すると、期待通りの結果が得られるかもしれません。
関連
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み】'cout'は型名ではない
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み] num++は'int num'のアトミックになり得るか?