ホームページ >バックエンド開発 >C++ >最適化されたマルチスレッド プログラムが停止するのはなぜですか? アトミック変数を使用してそれを修正するにはどうすればよいですか?

最適化されたマルチスレッド プログラムが停止するのはなぜですか? アトミック変数を使用してそれを修正するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-16 02:01:09502ブラウズ

Why Does My Optimized Multithreaded Program Stall, and How Can Atomic Variables Fix It?

最適化モードで停止する最適化されたマルチスレッド プログラム: アトミック変数による解決

次のマルチスレッド プログラムを考えてみましょう:

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:

static std::atomic<bool> finished = false;

として定義する必要があります。これにより、問題が解決され、プログラムが最適化モードで正常に実行され、目的の出力が表示されるようになります。

result = 1023045342
main thread>

の重要性std::atomic

std::atomic などのアトミック変数は、明確に定義されたスレッドセーフな方法で共有データへの同時アクセスと変更を保証します。これらは、ティアリングなどの予期しない動作を禁止し、正しいプログラム フローを意図せず変更する可能性のあるコンパイラの最適化を防ぎます。

追加の考慮事項

アトミック変数を使用すると同時実行の安全性が大幅に向上しますが、最適化は広範囲にわたる影響を与える可能性があることを認識することが重要です。たとえば、コンパイラは、パフォーマンスを向上させるために、保護されていない変数をレジスタに最適化したり、冗長なアクセスを排除したりすることがあります。意図しない最適化を防ぐには、適切な変数の保護とコンパイラーへの明示的な指示が重要です。

以上が最適化されたマルチスレッド プログラムが停止するのはなぜですか? アトミック変数を使用してそれを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。