首页 >后端开发 >C++ >为什么我的优化多线程程序在使用非原子布尔标志时会冻结?

为什么我的优化多线程程序在使用非原子布尔标志时会冻结?

Barbara Streisand
Barbara Streisand原创
2024-12-28 00:33:19296浏览

Why Does My Optimized Multithreaded Program Freeze When Using a Non-Atomic Boolean Flag?

多线程程序优化问题

在您的代码中,您有一个多线程程序,其中一个单独的线程在主线程等待时递增计数器一秒钟,然后设置一个标志来指示计数器线程停止。然而,当在优化模式(-O1 -O3)下运行时,程序会卡住而不会打印任何输出。

罪魁祸首:非原子变量访问

The问题源于“finished”变量,它是一个简单的布尔值,由多个线程同时访问,没有任何同步或原子性保证。并发访问时,此变量可能会导致未定义的行为 (UB)。

解决方案:使用 std::atomic

要解决此问题,“finished”变量应该被声明为原子类型,例如 std::atomic。 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中文网其他相关文章!

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