首页 >后端开发 >C++ >为什么我的优化多线程程序会停止运行,原子变量如何修复它?

为什么我的优化多线程程序会停止运行,原子变量如何修复它?

Barbara Streisand
Barbara Streisand原创
2024-12-16 02:01:09501浏览

Why Does My Optimized Multithreaded Program Stall, and How Can Atomic Variables Fix It?

优化多线程程序在优化模式下停滞:通过原子变量解析

考虑以下多线程程序:

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn