如何通熟易懂理解C11的六种memo

北京中科白癜风医院爱心接力不忘初心 http://m.39.net/baidianfeng/a_8563432.html

首先从一个程序员角度的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是必看。




转载请注明:http://www.aierlanlan.com/rzgz/3562.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了