问题:
一个简单的多线程程序在优化模式下编译时会出现意外行为。虽然程序在调试模式或使用 -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中文网其他相关文章!