teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

誤記修正

2021/01/15 14:08

投稿

dodox86
dodox86

スコア9416

answer CHANGED
@@ -1,5 +1,5 @@
1
1
  > このときAとBが1ずつずれていき,A+Bが常に100にならなければならないのですが,最後の最後で一気に値が変わっている状況です.
2
2
 
3
- 恐らくですが、実行環境に依存してそのような結果になっています。動作させているPCが速過ぎて、`ThreadProcessP2`スレッドが走り始めて`A=0, B=100`の状態がしばらく続き、その状態を出力し続け、`ThreadProcessP1`の実行が割り当てられたら一気に`A=100、B=0`まで処理を実行した後、`ThreadProcessP2`に実行が移っています。ちなみに当方の非力で遅いWindows PC(Windows 10の Cygwin環境)で試したところ、「A + B = 100」で正しく動きましたし、`std::lock_guard<std::mutex> lock(mutex);`を除去すると「A + B ≠ 100」となりました。
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自体の制限事項です。