最佳化多執行緒程式在最佳化模式下停滯:透過原子變數解析
考慮以下多執行緒程式:
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中文網其他相關文章!