首页 > 后端开发 > C++ > 为什么我的多线程程序在优化模式下停止但在 -O0 下工作?

为什么我的多线程程序在优化模式下停止但在 -O0 下工作?

Patricia Arquette
发布: 2024-12-29 22:02:30
原创
650 人浏览过

Why Does My Multithreaded Program Stall in Optimized Mode But Work in -O0?

多线程程序在优化模式下停止,但在 -O0 下正常运行

此问题是由共享变量不是原子的多线程程序引起的。具体来说,问题在于两个线程访问的布尔变量finished,没有任何同步或原子性。

在优化模式下,编译器假设多个线程访问的共享变量受到保护。然而,在此程序中,finished 被声明为常规布尔值,使其成为非原子的。这允许编译器优化多线程操作所必需的同步机制。

要解决此问题,应将 finish 声明为 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>
登录后复制

现场演示:coliru

其他注意事项:

  • 仅使用可变变量并不能保证原子性。虽然它们阻止编译器优化读/写操作,但它们不提供内存屏障或同步原语。
  • 现代编译器在优化方面非常积极。明确指示共享内存区域和资源同步要求以防止意外行为非常重要。

以上是为什么我的多线程程序在优化模式下停止但在 -O0 下工作?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板