TheRiver | blog

You have reached the world's edge, none but devils play past here

0%

c++ volatile atomic

最早接触valotile是在程序员的自我修养看到的,当时似懂非懂。这篇文章也挂在blog快一年了,今天重新查找资料,才算看明白了个大概。特此记录,毕竟是应用开发者,到此为止了

定义和区别

volatile是作用在单线程下,针对特定内存使用的。

atomic是c++11提供的原子类操作

原子性 可见性 有序性 禁用优化
atomic cas实现 缓存一致性实现 内存屏障实现 不支持
volatile 不支持 不支持 不支持 支持

有序性

1
2
3
4
5
6
x = y;
a = b;

// 可能被调整为
a = b;
x = y;

禁用优化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//--------------
int a = b;
a = b;

int c = 10;
c = 20;

//可能会被编译期优化为
int a = b;
int c = 20;

//--------------
std::atomic<int> y(x.load()); // 读取x
y.store(x.load()); // 再次读取x


//可能被优化为
//导致x的变化不可知
register = x.load(); // 将x读入寄存器
std::atomic<int> y(register); // 用寄存器值初始化y
y.store(register); // 将寄存器值保存至y

总结

  • atomic和volatile是完全不同的东西。
  • atomic可用在多线程中,对小数据进行原子操作,是安全的
  • volatile用于特殊内存防止编译器级别的优化,atomic用于普通内存,优化没有副作用,如果是特殊内存就用volatile,如果并且是多线程,可以叠加atomic使用
  • 可以搭配一起使用,atomic并不能取代volatile的作用,volatile也没有atomic的功能

reference

谈谈 C/C++ 中的 volatile

Memory Model: 从多处理器到高级语言

GCC 原子操作中 Acquire/Release/Consume/Relaxed 内存模型

ending

67243791_p0_lit.jpg

----------- ending -----------