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

相关推荐
桀人1 天前
C++——模板初阶(收录在专栏C++入门到精通)
开发语言·c++
Lumbrologist1 天前
【C++】零基础入门 · 第 2 节:变量、基本数据类型与输入输出
java·开发语言·c++
XX風1 天前
CMake / Make / Ninja / MSVC / GCC / Clang / MSBuild —— 完整体系化理解
c++
码完就睡1 天前
C语言——动态内存
c语言·开发语言
Peter·Pan爱编程1 天前
10. new_delete 不是 malloc_free 的包装
c++·人工智能·算法
故事和你911 天前
洛谷-【动态规划1】动态规划的引入2
开发语言·数据结构·c++·算法·动态规划·图论
fpcc1 天前
c++编程实践——历史记录的管理
c++
arronKler1 天前
MySQL命令行导出数据库
c语言·数据库·mysql
玖笙&1 天前
✨WPF编程基础【3.3】:容器控件(附源码)
c++·wpf·visual studio
汉克老师1 天前
GESP5级C++考试语法知识(十七、二分算法提高篇(二))
c++·算法·二分算法·gesp5级·gesp五级·二分算法易错点