首頁 > 後端開發 > C++ > 為什麼我的多執行緒程式在最佳化編譯後會掛起?

為什麼我的多執行緒程式在最佳化編譯後會掛起?

Linda Hamilton
發布: 2024-12-19 08:24:56
原創
952 人瀏覽過

Why Does My Multithreaded Program Hang When Compiled with Optimization?

多執行緒程式陷入最佳化模式

問題:

一個簡單的多執行緒程式在最佳化模式下編譯時會出現意外行為。雖然程式在偵錯模式或使用 -O0 時正常執行,但在使用 -O1、-O2 或 -O3 編譯時會卡住。

解:

問題在於完成變數的非原子存取。在多執行緒環境中,兩個執行緒存取不受保護的非原子變數可能會導致未定義的行為。要解決此問題,應將完成的變數設為原子變數。

修正:

#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中文網其他相關文章!

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