最適化モードで停止する最適化されたマルチスレッド プログラム: アトミック変数による解決
次のマルチスレッド プログラムを考えてみましょう:
static 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>
このプログラムはデバッグ モードまたは-O0 最適化フラグ。ただし、リリース モードまたは最適化フラグ -O1、-O2、または -O3 を使用して実行すると、問題が発生し、出力が提供されません。
原因と解決策
問題の原因は、複数のスレッドによって完了した非アトミックで保護されていない変数への同時アクセスにあります。この変数は原子性を保証しないため、未定義の動作が発生します。これを修正するには、finished を std::atomic として定義する必要があります。これにより、問題が解決され、プログラムが最適化モードで正常に実行され、目的の出力が表示されるようになります。 の重要性std::atomic std::atomic 追加の考慮事項 アトミック変数を使用すると同時実行の安全性が大幅に向上しますが、最適化は広範囲にわたる影響を与える可能性があることを認識することが重要です。たとえば、コンパイラは、パフォーマンスを向上させるために、保護されていない変数をレジスタに最適化したり、冗長なアクセスを排除したりすることがあります。意図しない最適化を防ぐには、適切な変数の保護とコンパイラーへの明示的な指示が重要です。 以上が最適化されたマルチスレッド プログラムが停止するのはなぜですか? アトミック変数を使用してそれを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。static std::atomic<bool> finished = false;
result = 1023045342
main thread>