Data Dependency
memory_order_consume
是关于data dependency的,我的理解是更细粒度的acquire-release,通过使用memory_order_consume
,可以避免对其他无依赖的数据强加同步。
关于data dependency,有两个关系(两个关系都有传递性),
- carries-a-dependency-to:在单线程中,如果操作A的结果被用作操作B的操作符,那么操作A carries-a-dependency-to 操作B。
- dependency-ordered-before:在线程之间,有标记为
memory_order_release
,memory_order_acq_rel
或memory_order_seq_cst
的store操作A,如果标记为memory_order_consume
的load操作B read了被store的数据,则操作A dependency-ordered-before 操作B。(操作A和B都是原子的)
线程之间,如果A dependency-ordered-before B,那么A happens-before B。
使用场景
对于这种memory ordering,一个典型的应用就是load一个指针指向的数据,其中load是原子操作。
|
|
上述代码中,p
的store是memory_order_release
的,它的load是memory_order_consume
的,循环保证了load能够读取到store的指针,因此当load能够读取到store的指针时,p
的store dependency-ordered-before 它的load。所以p
的store happens-before 它的load。
又因为x
的store happens-before p
的store,p
的load happens-before x
的load。
因此x
的store happens-before x
的load,对于x
的两个assert不会触发,但a
的load读取到的值是没有保证的。
kill_dependency
用kill_dependency
可以显式地打破依赖链。
对于如下代码(取自stackoverflow),
|
|
使用kill_dependency
让编译器知道不需要再次读取r2
的值,因此编译器可以将代码优化为,
|
|
甚至优化为,
|
|