問題:
単純なマルチスレッド プログラムが、最適化モードでコンパイルされると予期せぬ動作をします。プログラムはデバッグ モードまたは -O0 で正常に実行されますが、-O1、-O2、または -O3 でコンパイルするとプログラムが停止します。
解決策:
問題は、完成した変数への非アトミックなアクセスにあります。マルチスレッド環境では、2 つのスレッドがガードされていない非アトミック変数にアクセスすると、未定義の動作が発生する可能性があります。これを修正するには、完成した変数をアトミックにする必要があります。
修正:
#include <iostream> #include <future> #include <atomic> static std::atomic<bool> finished = false; int func() { size_t i = 0; while (!finished) ++i; return i; } int main() { auto result = std::async(std::launch::async, func); std::this_thread::sleep_for(std::chrono::seconds(1)); finished = true; std::cout << "result = " << result.get() << std::endl; std::cout << "\nmain thread>
説明:
std::atomic
追加の注意事項:
以上が最適化してコンパイルするとマルチスレッド プログラムがハングするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。