ホームページ >バックエンド開発 >C++ >最適化してコンパイルするとマルチスレッド プログラムがハングするのはなぜですか?

最適化してコンパイルするとマルチスレッド プログラムがハングするのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-19 08:24:56949ブラウズ

Why Does My Multithreaded Program Hang When Compiled with Optimization?

マルチスレッド プログラムが最適化モードでスタックする

問題:

単純なマルチスレッド プログラムが、最適化モードでコンパイルされると予期せぬ動作をします。プログラムはデバッグ モードまたは -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 を使用すると、完成した変数が確実にアクセスされ、変更されます。アトミックな方法で、競合状態や未定義の動作を防ぎます。

追加の注意事項:

  • この目的での volatile の使用は推奨されません。
  • コンパイラは、変数アクセス パターンを含むコードの実行を最適化できます。プログラムの正しい動作を保証するには、適切な同期プリミティブを使用することが重要です。

以上が最適化してコンパイルするとマルチスレッド プログラムがハングするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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