首页 >后端开发 >C++ >为什么我的多线程程序在优化编译后会挂起?

为什么我的多线程程序在优化编译后会挂起?

Linda Hamilton
Linda Hamilton原创
2024-12-19 08:24:56949浏览

Why Does My Multithreaded Program Hang When Compiled with Optimization?

多线程程序陷入优化模式

问题:

一个简单的多线程程序在优化模式下编译时会出现意外行为。虽然程序在调试模式或使用 -O0 时正常运行,但在使用 -O1、-O2 或 -O3 编译时会卡住。

解决方案:

问题在于对完成变量的非原子访问。在多线程环境中,两个线程访问不受保护的非原子变量可能会导致未定义的行为。要解决此问题,应将完成的变量设置为原子变量。

修复:

#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::endl;
    std::cout << "\nmain thread>

说明:

通过使用 std::atomic,我们确保以原子方式访问和修改完成的变量,从而防止竞争条件和未定义的行为。

附加说明:

  • 不建议为此目的使用 volatile,因为它不能保证提供必要的同步。
  • 编译器可以优化代码的执行,包括变量访问模式。使用适当的同步原语来确保正确的程序行为非常重要。

以上是为什么我的多线程程序在优化编译后会挂起?的详细内容。更多信息请关注PHP中文网其他相关文章!

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