[译]Atomic VS. Non-Atomic 操作
2016-05-08 16:38
260 查看
原文链接:atomic-vs-non-atomic-operations
在网上已经写了很多关于原子操作的文章,但是通常都集中在原子的读-修改-写(RMW. read-modify-write)操作。但是这些并是所有的原子操作。同样重要的属于原子操作的还是有load(译注:读)和store(译注:写)。在这篇文章中,我将会在处理器层面和C/C++语言层面,比较原子性和非原子性的load和store。顺便,我们将会阐明以下在C++11中的“数据竞争”概念。
你可能注意到,不管Mintomic还是C++11版本的代码都使用了relaxed语义的原子操作,也就是带有_relaxed后缀的内存序列参数。
特别地,关于relaxed语义的原子操作,在此原子操作的之前或者之后的指令都可能被影响,也就是被乱序执行。可能是因为编译器指令乱序或者处理器的指令乱序。编译器可能还是在重复的relaxed原子操作上做一些优化,就像在非原子性的操作上一样。在所有的情况下,这个操作都是原子操作。
当并发地操作共享变量,一贯地使用C++11 atomic库或者Mintomic是个好习惯,即使是你知道在你所针对的平台上,普通的load或store操作已经是原子操作。一个atomic库的方法可以起到一个提示作用,提示这个变量是并发访问的。
在网上已经写了很多关于原子操作的文章,但是通常都集中在原子的读-修改-写(RMW. read-modify-write)操作。但是这些并是所有的原子操作。同样重要的属于原子操作的还是有load(译注:读)和store(译注:写)。在这篇文章中,我将会在处理器层面和C/C++语言层面,比较原子性和非原子性的load和store。顺便,我们将会阐明以下在C++11中的“数据竞争”概念。
1 #include <atomic> 2 3 std::atomic<uint64_t> sharedValue(0); 4 5 void storeValue() 6 { 7 sharedValue.store(0x100000002, std::memory_order_relaxed); 8 } 9 10 uint64_t loadValue() 11 { 12 return sharedValue.load(std::memory_order_relaxed); 13 } 14View Code
你可能注意到,不管Mintomic还是C++11版本的代码都使用了relaxed语义的原子操作,也就是带有_relaxed后缀的内存序列参数。
特别地,关于relaxed语义的原子操作,在此原子操作的之前或者之后的指令都可能被影响,也就是被乱序执行。可能是因为编译器指令乱序或者处理器的指令乱序。编译器可能还是在重复的relaxed原子操作上做一些优化,就像在非原子性的操作上一样。在所有的情况下,这个操作都是原子操作。
当并发地操作共享变量,一贯地使用C++11 atomic库或者Mintomic是个好习惯,即使是你知道在你所针对的平台上,普通的load或store操作已经是原子操作。一个atomic库的方法可以起到一个提示作用,提示这个变量是并发访问的。
相关文章推荐
- 67. Add Binary
- 关于Div的宽度与高度的100%设定
- Android Button
- 网络(Java核心技术卷Ⅱ)
- python字符串处理
- sigsuspend()函数 解释
- CSS代码中-webkit,-moz,-o,-ms含义
- Android中的Adapter封装
- 框架选择
- Android 代码实现查看SQLite数据库中的表
- Ubuntu下载Android源码
- react-native入门
- Laravel与CI框架中截取字符串函数
- 实例对比WPF中的Timer和DispatcherTimer
- 学习进度条10
- poj 上的dp 留着慢慢写
- andfix使用
- java集合18--Iterator和Enumeration比较
- eclipse testng插件安装
- SVN Server配置详解 及备份