ホームページ > バックエンド開発 > C++ > マルチスレッド プログラムが最適化モードでは停止するのに、-O0 では動作するのはなぜですか?

マルチスレッド プログラムが最適化モードでは停止するのに、-O0 では動作するのはなぜですか?

Patricia Arquette
リリース: 2024-12-29 22:02:30
オリジナル
651 人が閲覧しました

Why Does My Multithreaded Program Stall in Optimized Mode But Work in -O0?

マルチスレッド プログラムが最適化モードで停止するが、-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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート