x86的多核宽松内存一致性模型
- 被修饰的汇编指令成为“原子的”
- 本身是原子指令,比如“XCHG”和“XADD”汇编指令
- 本身不是原子指令,但是被
LOCK指令前缀
修饰后成为原子指令,比如LOCK CMPXCHG - 被修饰的汇编指令A在执行期间,会在内存总线上声言一个
#LOCK
信号,该信号导致内存被锁住,此时内存不能再被其他汇编指令存取,直到A执行完成。经过分析可知,A的执行效果与“暂停执行其他所有汇编指令直到A执行完成等价,因此此时A是原子的
- fence
- sfence: 在sfence指令前的写操作当必须在sfence指令后的写操作前完成
- lfence:在lfence指令前的读操作当必须在lfence指令后的读操作前完成
- mfence:在mfence指令前的读写操作当必须在mfence指令后的读写操作前完成
-
C++11中支持的内存模型
- Acquire-Release能保证不同线程之间的Synchronizes-With关系,同时也约束到同一个线程中前后语句的执行顺序。
- Release-Consume只约束有明确的carry-a-dependency关系的语句的执行顺序,同一个线程中的其他语句的执行先后顺序并不受这个内存模型的影响
enum memory_order {
memory_order_relaxed, // Relaxed
memory_order_consume, // Release-Consume
memory_order_acquire, // Acquire-Release 用来修饰一个读操作,表示在本线程中,所有后续的关于此变量的内存操作都必须在本条原子操作完成后执行
memory_order_release, // Acquire-Release 用来修饰一个写操作,表示在本线程中,所有之前的针对该变量的内存操作完成后才能执行本条原子操作
memory_order_acq_rel, // Acquire-Release 同时包含memory_order_acquire和memory_order_release标志
memory_order_seq_cst // 顺序一致性模型
};