优化多线程程序在优化模式下停滞:通过原子变量解析
考虑以下多线程程序:
static 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>
该程序在调试模式下或使用 -O0 优化标志按预期运行。但是,当在发布模式下或使用优化标志 -O1、-O2 或 -O3 执行时,它会遇到问题并且无法提供任何输出。
原因和解决方案
问题的根源在于多个线程同时访问非原子且不受保护的变量。该变量不保证原子性,导致未定义的行为。要纠正此问题,应将 finish 定义为 std::atomic
static std::atomic<bool> finished = false;
这可以解决问题并允许程序在优化模式下成功运行,显示所需的输出:
result = 1023045342 main thread>
意义std::atomic
原子变量,例如 std::atomic
其他注意事项
虽然使用原子变量可以显着提高并发安全性,必须意识到优化可能会产生深远的影响。例如,编译器可能会将不受保护的变量优化到寄存器中或消除冗余访问以提高性能。为了防止意外的优化,适当的变量保护和对编译器的显式指令至关重要。
以上是为什么我的优化多线程程序会停止运行,原子变量如何修复它?的详细内容。更多信息请关注PHP中文网其他相关文章!