問題:
一個簡單的多執行緒程式在最佳化模式下編譯時會出現意外行為。雖然程式在偵錯模式或使用 -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
附加說明:
以上是為什麼我的多執行緒程式在最佳化編譯後會掛起?的詳細內容。更多資訊請關注PHP中文網其他相關文章!