理论一致性模型与C++内存序模型的对应关系咨询
下面是共享内存架构中四种需显式同步的一致性模型与C++内存序模型的对应关系:
1. Weak ordering(弱序)
对应C++中的memory_order_seq_cst。
弱序模型将操作分为数据操作与同步操作,同步操作会确保处理器完成并感知所有处理器此前的全部操作。这与memory_order_seq_cst的语义完全匹配:所有标记为seq_cst的原子操作构成一个全局总序,任何线程观察到的seq_cst操作顺序都完全一致,且seq_cst操作会阻止前后的内存操作重排,确保全局可见性。
2. Release Consistency(释放一致性)
对应C中的memory_order_acquire、memory_order_release及memory_order_acq_rel。
释放一致性区分进入临界区的acquire操作与退出的release操作:acquire确保本地所有内存操作完成,release确保本地变更传播至其他处理器。这和C的acquire/release语义完全对应:release操作会将当前线程之前的所有写操作同步到后续执行acquire操作的线程;acquire操作会确保后续的读操作能看到release之前的所有写操作;acq_rel则同时具备两者的语义,适用于既需要获取同步也需要释放同步的场景(比如互斥锁的解锁加锁)。
3. Entry Consistency(进入一致性)
C标准中没有直接对应的内置内存序模型,但可以通过为每个共享变量绑定专属的同步原语(如互斥锁、针对该变量的原子操作),并使用memory_order_acquire/memory_order_release语义来模拟。
进入一致性要求每个共享变量对应专属同步变量,对变量x执行acquire时仅需完成x相关的操作,release时仅传播x相关的变更。在C中,我们可以为每个共享变量单独使用同步操作,避免全局同步的开销——比如对某个特定的原子变量使用acquire/release操作,只会约束与该变量相关的内存访问,而非所有内存操作,这就实现了进入一致性的核心逻辑。
4. Local Consistency(本地一致性)
对应C++中的memory_order_relaxed。
本地一致性仅保证单个线程按程序定义的顺序执行自身操作,对其他线程的写操作顺序无约束。memory_order_relaxed原子操作正好满足这一点:它只保证线程内的操作遵循程序顺序(线程内不会出现违反代码顺序的重排),但线程间的操作没有任何同步关系,不同线程观察到的写操作顺序可以不一致。
内容的提问来源于stack exchange,提问作者Sourav Kannantha B

