多线程程序优化问题
在您的代码中,您有一个多线程程序,其中一个单独的线程在主线程等待时递增计数器一秒钟,然后设置一个标志来指示计数器线程停止。然而,当在优化模式(-O1 -O3)下运行时,程序会卡住而不会打印任何输出。
罪魁祸首:非原子变量访问
The问题源于“finished”变量,它是一个简单的布尔值,由多个线程同时访问,没有任何同步或原子性保证。并发访问时,此变量可能会导致未定义的行为 (UB)。
解决方案:使用 std::atomic
要解决此问题,“finished”变量应该被声明为原子类型,例如 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>
说明:
在修改后的代码中,“finished”变量被声明为std::atomic
优化注意事项
在优化模式下,编译器可能会执行激进的优化,如果数据未正确同步。通过使用 std::atomic,您可以显式指示编译器维护“完成”变量的原子性,即使在优化构建中也是如此。
以上是为什么我的优化多线程程序在使用非原子布尔标志时会冻结?的详细内容。更多信息请关注PHP中文网其他相关文章!