多執行緒程式在最佳化模式下停止,但在-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中文網其他相關文章!