首頁 >後端開發 >C++ >為什麼我的最佳化多執行緒程式會停止運行,原子變數如何修復它?

為什麼我的最佳化多執行緒程式會停止運行,原子變數如何修復它?

Barbara Streisand
Barbara Streisand原創
2024-12-16 02:01:09498瀏覽

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 執行時,它會遇到問題並且無法提供任何輸出。

原因和解決方案

問題的根源在於多個執行緒同時存取非原子且不受保護的變數。此變數不保證原子性,導致未定義的行為。要修正此問題,應將finish 定義為std::atomic:

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

這可以解決問題並允許程式在最佳化模式下成功運行,顯示所需的輸出:

result = 1023045342
main thread>

意義std::atomic

原子變量,如std::atomic,確保以明確定義和線程安全的方式同時存取和修改共享資料。它們禁止諸如撕裂之類的意外行為,並防止編譯器優化可能無意中改變正確的程式流程。

其他注意事項

雖然使用原子變數可以顯著提高並發安全性,必須意識到最佳化可能會產生深遠的影響。例如,編譯器可能會將不受保護的變數最佳化到暫存器中或消除冗餘存取以提高效能。為了防止意外的最佳化,適當的變數保護和對編譯器的明確指令至關重要。

以上是為什麼我的最佳化多執行緒程式會停止運行,原子變數如何修復它?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn