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

相关推荐
Navigator_Z1 小时前
LeetCode //C - 1317. Convert Integer to the Sum of Two No-Zero Integers
c语言·算法·leetcode
wo_jack1 小时前
C++ 入门笔记(十六):第16课 vector 模拟实现十问十答 —— 从三指针到迭代器失效
c++·后端·面试·stl·vector
D e re k ZH1 小时前
C++ 标准库算法全景指南
数据结构·c++·算法
冻柠檬飞冰走茶2 小时前
字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)
c语言·开发语言·数据结构·算法·动态规划
雪落漂泊3 小时前
C++算法 二分查找篇(上)
开发语言·c++·算法
不会算法的笨小孩4 小时前
异常的使用以及会出现的问题
开发语言·c++·c++11·异常
Hhy_11076 小时前
《C++深度解构06》手撕 string —— 从底层内存管理到深浅拷贝彻底吃透
c语言·开发语言·c++·学习·visual studio
青少儿编程课堂7 小时前
蓝桥杯青少组图形化省考报名倒计时·全国青少年信息素养大赛·电子学会图形化考级:校园黑白棋人机对战解析
c++·python·算法·bfs·信息学竞赛
YSL0701247 小时前
C++基础
开发语言·c++
eggwyw8 小时前
关于C++为什么不加入垃圾回收机制解析
开发语言·c++