转载于知乎问题:https://www.zhihu.com/question/24301047
其实多线程间代码本来就是各自执行各自的,这个和memory order是两个概念,memory order是针对单线程重排序规则的概念,概念本身可以不讲多线程。多线程只是利用了memory order的规则加内存一致性来做线程同步而已。
因为概念混乱,1,2,3,4都不太对的感觉。
第一点,relaxed,线程内不保证所有原子操作是顺序进行的,而是如其字面意思在不影响逻辑的条件下最大限度的重排序(relax顺序),而非relax多线程间任意顺序。
第二点,release acquice本身是没有什么先后关系的,内存一致性保证了多线程读到的总是最新值,而不是因为release, acquice了才会读到。通常用法是acquice死循环反复读,多次读之后来确认release已经写入了这样做来达到线程同步。
第三点,release consume同样会影响release前的所有写操作,只要是release,这个之前的操作就不能重排序到release之后。consume的限制比acquire少的地方在于允许和consum变量无关的操作重排序到consume前。
第四点, sequential,就是各自线程顺序执行不进行重排序而已,和多线程同步不同步的是两个概念。