std :: atomic :: compare_exchange_weak的虚假失败,以防值等于预期值

时间:2016-12-13 21:37:41

标签: c++ multithreading c++11 atomic

我对std :: atomic :: compare_exchange_weak的虚假失败感到困惑。

  1. 如果原子变量的值是预期的值,compare_exchange_weak会失败吗?
  2. 如果答案是肯定的:有没有办法知道价值是否是预期值?因为我的代码假设如果CAS失败,那么该值不是预期值。
  3. 特别是,即使出现虚假故障,compare_exchange_weak还是将'expected'参数设置为当前值?在这种情况下,这个值可能是预期值(如果CAS由于某些时间问题而失败了......)或不是?
  4. 编辑:澄清第3点:我没有提到用CAS更改变量值本身,而是更改'expected'参数引用。问题是compare_exchange_weak是否将此引用更改为变量的当前值 - 通常,特别是在虚假失败的情况下。我问它是因为我的代码假定在CAS之后,'expected'参数保存当前值。 (根据我得到的第二个问题的答案,我认为答案是'预期'论证永远不会在弱版本中更新。正确吗?)

2 个答案:

答案 0 :(得分:4)

弱交换功能可能无法更新,以便在引擎盖下实现更高性能的实现。它们倾向于在循环检查中使用,因为它不会在下一次循环迭代中得到它。

所以,具体答案......

  1. 是的,失败的是,如果值== expected_value,它可能无法更新。
  2. 如果您确实需要以可靠的方式了解,请不要使用这些功能的弱版本。转而选择强者。
  3. 不,如果该值不是预期值,它将永远不会覆盖该值。

答案 1 :(得分:1)

1)是的。它是虚假失败的定义:它就好像真实价值不等于预期,即使它们是。

2)如果您必须知道或确保没有发生虚假故障,请使用compare_exchange_strong

3)不,它没有。它会违反合同:仅在real == expected时写入,但它会将值加载到expected,即使它是相同的:

  

N3797
   [atomics.types.operations.req] / 25

     

备注:弱比较和交换操作可能会失败。也就是说,即使期望和对象引用的内存内容相等,它也可能返回false并存储回预期与原来相同的内存内容。