Linux C++ 中的 volatile变量在多线程环境下进行运算的问题

cpp 复制代码
#include <iostream>
#include <thread>
#include <vector>

// 定义一个 volatile 变量
volatile int count = 0;

// 线程函数
void increment() {
    for (int i = 0; i < 100000; i++) {
        // 对 volatile 变量进行自增操作
        count++;
    }
}

int main() {
    std::vector<std::thread> threads;

    // 创建两个线程
    threads.emplace_back(increment);
    threads.emplace_back(increment);

    // 等待两个线程执行完毕
    for (auto& thread : threads) {
        thread.join();
    }

    // 输出最终的 count 值
    std::cout << "最终的 count 值: " << count << std::endl;

    return 0;
}

结果为 131087,不是预期的 200000。

结论:

  1. volatile确保每次读取都从内存获取最新值,但无法阻止多个线程同时执行"读-改-写"操作,导致数据丢失
  2. volatile不提供内存屏障(memory barrier),因此一个线程的写入可能不会立即对其他线程可见,尤其是在多核CPU缓存不一致的情况下。
  3. 编译器优化被禁止,但 CPU乱序 执行仍需内存屏障控制

volatile 变量和普通的变量一样,没有指名是原子变量,就是线程不安全。

相关推荐
chenbingjie_c1 小时前
C++ 进阶核心知识点总结:模板、内存分区、new/delete、内存池
开发语言·c++
Escalating_xu3 小时前
【C 语言】深入理解指针(1·下):指针运算、野指针、assert 与传址实战
java·c语言·开发语言
Frank_refuel3 小时前
【C++】Json库介绍和使用
c++
重生之小比特3 小时前
【C++进阶】map和set
java·开发语言·c++
阿钱真强道4 小时前
20 嵌入式操作系统 | ubus:把自己的程序状态暴露出去
c语言·进程通信·ubus·ubusd·blobmsg
知识分享小能手4 小时前
C++ 学习教程,从入门到精通,C++对象和类 — 详细知识点总结(10)
开发语言·c++·学习
顺顺 尼5 小时前
linux 进程信号(上)
linux·c++·算法
海上小飞龙6 小时前
改一个数,右边全得重算,这题怎么扛住两万次查询
java·c++·python
Persistent的粽子!6 小时前
双指针算法:最大盛水容器
c++·算法·leetcode
小小龙学IT6 小时前
三菱 PLC MC 协议(SLMP / QnA 兼容 3E 帧)深度解析:从帧结构到 C++/Go 双语言采集实战
c语言·c++·golang