std::atomic::compare_exchange_weak 的虚假失败,以防值等于预期
Spurious failure of std::atomic::compare_exchange_weak in case the value equals to expected
我对 std::atomic::compare_exchange_weak 的虚假故障感到困惑。
- 如果原子变量的值是预期值,compare_exchange_weak 会失败吗?
- 如果答案是肯定的:有没有办法知道这个值是否是预期值?因为我的代码假设如果 CAS 失败,那么该值不是预期的值。
- 特别是,即使出现虚假故障,compare_exchange_weak 是否也会将 'expected' 参数设置为当前值?在这种情况下,这个值可能是预期值(以防 CAS 由于某些时间问题而失败……)或不是?
编辑:澄清第3点:我不是指通过CAS改变变量值本身,而是改变'expected'参数引用。问题是 compare_exchange_weak 是否将此引用更改为变量的当前值——一般情况下,尤其是在出现虚假故障的情况下。我问它是因为我的代码假定在 CAS 之后,'expected' 参数保存当前值。 (根据我对第二个问题的回答,我假设答案是 'expected' 参数在弱版本中永远不会更新。正确吗?)
1) 是的。这是虚假失败的定义:它表现得好像真实价值不等于预期,即使它们是。
2) 如果您必须知道或确保不会发生虚假故障,请使用 compare_exchange_strong
。
3) 不,它没有。它会违反合同:仅在 real == expected
时写入,但它会将值加载到 expected
,即使它是同一个:
N3797
[atomics.types.operations.req]/25
Remark: A weak compare-and-exchange operation may fail spuriously. That is, even when the contents of memory referred to by expected and object are equal, it may return false and store back to expected the same memory contents that were originally there.
弱交换功能可能无法更新,以便在引擎盖下实现更高性能。它们往往用于循环检查,因为它会在下一次循环迭代中得到它。
所以,具体答案...
- 是的,失败是如果value == expected_value.
会更新失败
- 如果您确实需要以可靠的方式了解,请不要使用这些功能的弱版本。取而代之的是强者。
- 不,如果不是预期值,它永远不会覆盖该值。
我对 std::atomic::compare_exchange_weak 的虚假故障感到困惑。
- 如果原子变量的值是预期值,compare_exchange_weak 会失败吗?
- 如果答案是肯定的:有没有办法知道这个值是否是预期值?因为我的代码假设如果 CAS 失败,那么该值不是预期的值。
- 特别是,即使出现虚假故障,compare_exchange_weak 是否也会将 'expected' 参数设置为当前值?在这种情况下,这个值可能是预期值(以防 CAS 由于某些时间问题而失败……)或不是?
编辑:澄清第3点:我不是指通过CAS改变变量值本身,而是改变'expected'参数引用。问题是 compare_exchange_weak 是否将此引用更改为变量的当前值——一般情况下,尤其是在出现虚假故障的情况下。我问它是因为我的代码假定在 CAS 之后,'expected' 参数保存当前值。 (根据我对第二个问题的回答,我假设答案是 'expected' 参数在弱版本中永远不会更新。正确吗?)
1) 是的。这是虚假失败的定义:它表现得好像真实价值不等于预期,即使它们是。
2) 如果您必须知道或确保不会发生虚假故障,请使用 compare_exchange_strong
。
3) 不,它没有。它会违反合同:仅在 real == expected
时写入,但它会将值加载到 expected
,即使它是同一个:
N3797
[atomics.types.operations.req]/25Remark: A weak compare-and-exchange operation may fail spuriously. That is, even when the contents of memory referred to by expected and object are equal, it may return false and store back to expected the same memory contents that were originally there.
弱交换功能可能无法更新,以便在引擎盖下实现更高性能。它们往往用于循环检查,因为它会在下一次循环迭代中得到它。
所以,具体答案...
- 是的,失败是如果value == expected_value. 会更新失败
- 如果您确实需要以可靠的方式了解,请不要使用这些功能的弱版本。取而代之的是强者。
- 不,如果不是预期值,它永远不会覆盖该值。