首先从一个程序员角度的Takeaway,虽然是六种类型,但是理解了四种同步的情形基本就差不多了。在单个线程内,所有原子操作是顺序进行的
通俗地说,我们可以说一个内存系统是为Coherent,如果任何一个对数据的读操作总是返回其最近被改写的值。
按照什么顺序?基本上就是代码顺序(sequenced-before)。这就是唯一的限制了!两个来自不同线程的原子操作是什么顺序?两个字:“任意”
C++memoryorder是对atomic操作的一种约束,通常这个atomic是一个多线程共享的变量,因此我们要约定当前CPU操作这个变量的顺序。
事实上,Sequentially-consistentordering是目前绝大多数编译器的缺省设置。随着硬件技术的发展,内存的访问已经跟不上CPU的执行速度,此时内存反而变成了瓶颈。为了加速读写速度,每个CPU也都有自己内部才能访问的缓存,
最简单的情况,就是这两个线程依次执行,即一个线程执行完毕之后再执行另一个线程的指令,这种情况下有两种可能:
1-2-3-4
这种情况先执行完毕线程1,再执行线程2,最后输出的结果是(0,1)。所以,atom本身就是一种锁。它自己就已经完成了线程间同步的问题。这里并没有那6个memoryorder的什么事情。
另外一个就是memoryorder中对于同一个sharedmemorylocation虽然也会有reorder,比如TSO中的store-load特性,问题在于以这个原子操作为中心,其前后的代码。这些代码并不一定需要是原子操作,只是普通的代码就行。
对同一个memorylocation也是存在reorder,但是其通过使用bypassing来保证这种reorder不改变当期memorylocation在单线程中原有的意义。
用不同的内存序是因为要求的宽松不同,越弱的要求可以容许更多的排列可能,这当然是个优化,要不然你加全局锁也可以,直接变单线程。如果一定要理解,首先要保证理解默认的和relaxed.为了能够理解这些概念,你还需要知道happens-before和synchronized-with.归结到底,c++concurrencyinaction是必看。