多线程程序在优化模式下停止,但在 -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中文网其他相关文章!