C++ Details of Asymmetric Fences
9 days ago
- #Memory Model
- #Linux Kernel
- #Concurrency
- 非对称线程栅栏通过将繁重的同步开销从常见路径转移到不频繁的慢速路径来优化并发,在快速路径上使用轻量级编译器屏障,在慢速路径上使用更强的栅栏。
- 轻量级栅栏(asymmetric_thread_fence_light)被实现为编译器屏障(例如:asm volatile("" : : : "memory")),防止编译器重排序但不阻止硬件重排序。
- 在Linux上,重量级栅栏(asymmetric_thread_fence_heavy)使用membarrier()系统调用,该系统调用通过发出处理器间中断(IPIs)来强制执行跨核心的内存排序,涉及在发送IPI前后使用smp_mb()屏障。
- C++标准通过将非对称栅栏(P1202R5)纳入内存模型来将其正式化,其中规则影响了memory_order_seq_cst操作的单次全序S,并要求谨慎处理以避免传递性问题。
- 实现细节包括在单核或单内存管理(mm)场景中对membarrier()的快速路径优化、特定架构的smp_mb()实现,以及对数据竞争和happens-before关系的考量。