マルチスレッド プログラムが最適化モードで停止するが、-O0 では正常に実行される
この問題は、共有変数がアトミックではないマルチスレッド プログラムから発生します。具体的には、同期やアトミック性を持たずに 2 つのスレッドによってアクセスされるブール変数 completed に問題があります。
最適化モードでは、コンパイラは、複数のスレッドによってアクセスされる共有変数が保護されていると想定します。ただし、このプログラムでは、finished は通常の bool として宣言され、非アトミックになります。これにより、コンパイラはマルチスレッド操作に不可欠な同期メカニズムを最適化できます。
この問題を解決するには、finished を std::atomic
修正コード:
#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::cout << "\nmain thread>
ライブ デモ: coliru
追加の考慮事項:
以上がマルチスレッド プログラムが最適化モードでは停止するのに、-O0 では動作するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。