首頁 > 後端開發 > C++ > 為什麼我的多執行緒程式在最佳化模式下停止但在 -O0 下工作?

為什麼我的多執行緒程式在最佳化模式下停止但在 -O0 下工作?

Patricia Arquette
發布: 2024-12-29 22:02:30
原創
650 人瀏覽過

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

多執行緒程式在最佳化模式下停止,但在-O0 下正常運作

此問題是由共享變數不是原子的多線程程序引起的。具體來說,問題在於兩個執行緒存取的布林變數finished,沒有任何同步或原子性。

在最佳化模式下,編譯器假設多個執行緒存取的共享變數受到保護。然而,在此程序中,finished 被聲明為常規布林值,使其成為非原子的。這允許編譯器優化多執行緒操作所必需的同步機制。

要解決此問題,應將 finish 聲明為 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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板