1. acquire/release 语义与完整 memory fence 各自约束哪些重排,为何前者通常开销更低?
请解释 acquire/release 语义与完整 memory fence 各自约束哪些重排,以及为何前者通常开销更低?
- 理解 release 语义
- 理解完整 fence 语义
- 理解开销差异
acquire 语义约束"该操作之后的内存操作不能重排到它之前"(acquire 之后的操作不能被重排到 acquire 之前),只约束一侧;release 语义约束"该操作之前的内存操作不能重排到它之后"(release 之前的操作不能下移到 release 之后),也只约束一侧。完整 memory fence(全屏障)约束两侧:既阻止之后的操作上移,也阻止之前的操作下移,即全序屏障。开销差异:acquire/release 是"单向"半屏障,只在需要的一侧施加约束,硬件只需在该侧插入屏障,重排自由度更大、开销更低;完整 fence 是双向全屏障,约束更严格,硬件需更强的序列化,开销更高。因此 acquire/release 因只约束一侧而更便宜,且能表达正确的同步语义。
acquire 只约束"之后不重排到之前",release 只约束"之前不重排到之后",各是一侧。完整 fence 两侧都约束。开销随约束强度增大,acquire/release 更便宜。