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 变量和普通的变量一样,没有指名是原子变量,就是线程不安全。

相关推荐
QiLinkOS8 小时前
第三视觉理解徐玉生与他的商业活动(30)
大数据·c++·人工智能·算法·开源协议
mit6.8248 小时前
阅读的核心,是再读
c++
upgrador10 小时前
基础知识:C++ STL构造函数的左闭右开惯例及其实现原理
开发语言·c++
灯厂码农11 小时前
C语言动态内存分配完全指南(malloc、calloc、realloc、free)
java·c语言·算法
wuyk55511 小时前
24. C 语言模块化:不是拆几个.c 文件那么简单
c语言·开发语言·stm32·单片机
qq_2415856112 小时前
可用在中断中浮点数打印类似printf
c语言
凯瑟琳.奥古斯特12 小时前
K次取反最大化数组和解法(力扣1005)
开发语言·c++·算法·leetcode·职场和发展
林中青木12 小时前
CT重构原理及C++代码实现
c++·计算机视觉·重构
满天星830357712 小时前
Protobuf的介绍及使用
c++
☆cwlulu13 小时前
调试排查工具介绍(gdb、strace、Valgrind等)
开发语言·c++·嵌入式硬件·ubuntu