C++中std::memory_order_seq_cst栅栏的相关技术疑问
关于std::memory_order_seq_cst栅栏的疑问解答
一、std::memory_order_seq_cst栅栏的本质
std::memory_order_seq_cst栅栏属于acq-rel类型栅栏+单一全局全序约束:
- 它同时具备
memory_order_acquire和memory_order_release栅栏的所有内存可见性约束; - 额外要求所有
seq_cst类型的操作(包括栅栏、加载、存储、读改写)必须服从一个全局统一的执行顺序,这个顺序对所有线程完全一致。
二、对栅栏指令重排规则的纠正
你的部分理解正确,但关于acq-rel栅栏的描述存在绝对化问题,以下是准确规则:
memory_order_acquire栅栏:- 禁止栅栏之后的读/读改写操作被重排到栅栏之前;
- 允许栅栏之前的写操作被移到栅栏之后(仅约束后续读,不限制前置写)。这部分你的理解无误。
memory_order_release栅栏:- 禁止栅栏之前的写/读改写操作被重排到栅栏之后;
- 允许栅栏之后的读操作被移到栅栏之前(仅约束前置写,不限制后续读)。这部分你的理解也正确。
memory_order_acq_rel栅栏:- 并非完全禁止所有指令跨栅栏移动,而是双向约束特定操作:
- 栅栏之前的写/读改写操作,不能被重排到栅栏之后;
- 栅栏之后的读/读改写操作,不能被重排到栅栏之前;
- 栅栏之前的读操作、栅栏之后的写操作,是可以跨栅栏重排的(因为acquire不限制前置读,release不限制后续写)。
- 并非完全禁止所有指令跨栅栏移动,而是双向约束特定操作:
内容的提问来源于stack exchange,提问作者Sourav Kannantha B
相关产品推荐
相关产品推荐

