基于原子操作结果:能否由修改顺序推导happens before关系?
代码示例
// 线程1: obj.store(1, Release); // #1 // 线程2: obj.store(2, Release); // #2 // 线程3: obj.load(Acquire); // #3 obj.load(Relaxed); // #4
前提假设与推导结论
假设#3读取值为1,#4读取值为2,可推导出以下结论:
#1 happens before #3,依据[intro.races] p9.1
A synchronizes with B(A同步于B)
#2不happens before #3,依据[intro.races] p18
若原子对象M上的副作用X happens before M的值计算B,则B的取值要么来自X,要么来自M修改顺序中在X之后的副作用Y。
#3 happens before #4,依据[intro.races] p10.1
A被排在B之前(A is sequenced before B)
结合第三条结论与[intro.races] p16规则,可推断#2的副作用在obj的修改顺序中跟随#1。
问题与解答
那么,依据[intro.races] p15规则(若修改原子对象M的操作A happens before操作B,则A在M的修改顺序中早于B),能否推断#1 happens before #2?
你的判断完全正确——“A在M的修改顺序中早于B”只是“A happens before B”的必要非充分条件,仅通过#2在修改顺序中跟随#1这一点,无法反向推导出#1 happens before #2。
[intro.races] p15的逻辑是单向的:happens before关系可以推导出修改顺序的先后,但修改顺序的先后不能反过来推导出happens before关系。在这个场景中,#1和#2属于不同线程的操作,两者之间没有任何同步机制建立happens before关系,即便修改顺序上#1先于#2,也不满足happens before的定义要求。
内容的提问来源于stack exchange,提问作者xmh0511

