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

相关推荐
♛识尔如昼♛2 小时前
C 基础(7) - 字符输入/输出和输入验证
c语言·开发语言
小肝一下2 小时前
c++从入门到跑路——string类
开发语言·c++·职场和发展·string类
老花眼猫2 小时前
数学艺术图案画-曼陀罗(一)
c语言·经验分享·青少年编程·课程设计
楼田莉子2 小时前
设计模式:构造器模式
开发语言·c++·后端·学习·设计模式
邪修king2 小时前
UE5 零基础入门第二弹:让你的几何体 “活” 起来 ——Actor 基础与蓝图交互入门
c++·ue5·交互
戏舟的嵌入式开源笔记2 小时前
上手RP2040(基于C SDK)
c语言·pico·嵌入式软件·rp2040
jolimark2 小时前
Windows下如何用GCC编译C语言?轻便方法分享
c语言·windows·git·mingw·gcc编译器
玉树临风ives2 小时前
atcoder ABC 453 题解
数据结构·c++·算法·图论·atcoder
小则又沐风a2 小时前
STL库: string类
开发语言·c++