回答編集履歴
1
誤記修正
answer
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
> このときAとBが1ずつずれていき,A+Bが常に100にならなければならないのですが,最後の最後で一気に値が変わっている状況です.
|
2
2
|
|
3
|
-
恐らくですが、実行環境に依存してそのような結果になっています。動作させているPCが速過ぎて、`ThreadProcessP2`スレッドが走り始めて`A=
|
3
|
+
恐らくですが、実行環境に依存してそのような結果になっています。動作させているPCが速過ぎて、`ThreadProcessP2`スレッドが走り始めて`A=100, B=0`の状態がしばらく続き、その状態を出力し続け、`ThreadProcessP1`の実行が割り当てられたら一気に`A=0, B=100`まで処理を実行した後、`ThreadProcessP2`に実行が移っています。ちなみに当方の非力で遅いWindows PC(Windows 10の Cygwin環境)で試したところ、「A + B = 100」で正しく動きましたし、`std::lock_guard<std::mutex> lock(mutex);`を除去すると「A + B ≠ 100」となりました。
|
4
4
|
|
5
5
|
ご提示のコードでは重い処理をシミュレートする為にWindows APIの`Sleep`を使い、`Sleep(1);`のように1ミリ秒をセットしていますが、もっと大きい値、たとえば200ミリ秒とか500ミリ秒をセットしてみてください。尚、1ミリ秒をセットしても実際は数10ミリ秒程度の不定な値でしかスリープできていません。Windows自体の制限事項です。
|