1. 相关文章
这一块文章较多,但是鱼龙混杂,这里贴出来比较好的几篇文章。
关于内存序目前看到的最好的两篇文章,作者写的图文并茂,层层递进,是非常高水平的技术文章:
关于 C++11 中的atomic和内存序:
- c++:从单例到内存屏障
- 理解 C++ 的 Memory Order
- C++多线程系列-3 内存序列和内存屏障
- C++11中静态局部变量初始化的线程安全性:C++11用static静态局部实例可以实现线程安全的单例。
2. 理解
对于内存序,我个人理解是为了对某些计算机系统设计对性能的妥协,而打的补丁。
atomic可以保证原子性,原子性是为了在线程间加锁。而内存序是为了在单线程执行视角下,保证指令的相对顺序和编码中的顺序一致。所以原子性+顺序一致性就可以保证数据在线程间和线程内都是安全的,不会被意外篡改。
atmic模板类,简单理解就是另外一种高效的锁,由操作系统内核保证原子性。例如,可以把store看作:
void store(const T &val)
{
staic std::mutex mutex;
std::lock_guard<std::mutex> locker(mutex);
this->val = val;
}
其他原子函数类似。上面的mutex只是示意,实际实现中,编译器采用的是更加底层的,更加高效的底层硬件相关的锁,具体是什么这里不深究了,有空可以找找资料,看看gcc的具体实现。
关于std::atomic的使用: