我对std :: atomic :: compare_exchange_weak的虚假失败感到困惑。
编辑:澄清第3点:我没有提到用CAS更改变量值本身,而是更改'expected'参数引用。问题是compare_exchange_weak是否将此引用更改为变量的当前值 - 通常,特别是在虚假失败的情况下。我问它是因为我的代码假定在CAS之后,'expected'参数保存当前值。 (根据我得到的第二个问题的答案,我认为答案是'预期'论证永远不会在弱版本中更新。正确吗?)
答案 0 :(得分:4)
弱交换功能可能无法更新,以便在引擎盖下实现更高性能的实现。它们倾向于在循环检查中使用,因为它不会在下一次循环迭代中得到它。
所以,具体答案......
答案 1 :(得分:1)
1)是的。它是虚假失败的定义:它就好像真实价值不等于预期,即使它们是。
2)如果您必须知道或确保没有发生虚假故障,请使用compare_exchange_strong
。
3)不,它没有。它会违反合同:仅在real == expected
时写入,但它会将值加载到expected
,即使它是相同的:
N3797
[atomics.types.operations.req] / 25备注:弱比较和交换操作可能会失败。也就是说,即使期望和对象引用的内存内容相等,它也可能返回false并存储回预期与原来相同的内存内容。