首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当std::atomic::compare_exchange_weak值等于预期值时的虚假失效

当std::atomic::compare_exchange_weak值等于预期值时的虚假失效
EN

Stack Overflow用户
提问于 2016-12-13 21:37:40
回答 2查看 1.5K关注 0票数 4

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

  1. 如果原子变量的值是预期的值,compare_exchange_weak会失败吗?
  2. 如果答案是肯定的:有没有办法知道这个值是否是预期值?因为我的代码假定,如果CAS失败,则该值不是预期的值。
  3. 特别是,即使在出现虚假故障的情况下,compare_exchange_weak是否也将“预期”参数设置为当前值?在这种情况下,这个值可能是预期的值(如果CAS由于某些时间问题(…)失败)还是不想?

编辑:为了澄清第三点:我不是指由CAS更改变量值本身,而是指更改“预期”参数引用。问题是compare_exchange_weak是否更改了对变量当前值的引用--无论是一般情况还是在出现虚假故障的情况下。我之所以这样做,是因为我的代码假设在CAS之后,“预期”参数保存当前值。(根据我对第二个问题的回答,我认为答案是“预期”论点在弱版本中从未更新过。对吗?)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-13 21:45:32

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

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

( 3)不。但事实并非如此。这将违反合同:只在real == expected中写入,但它将将值加载到expected,即使它是相同的:

N3797 atomics.types.operations.req/25评论:弱的比较和交换操作可能会伪造地失败.也就是说,即使预期和对象所引用的内存内容相等,它也可能返回false,并将原来存在的内存内容存储回预期的内存内容。

票数 5
EN

Stack Overflow用户

发布于 2016-12-13 21:47:11

弱交换函数可能无法更新,以便在引擎盖下具有更高的性能实现。它们通常用于循环检查,而在不太重要的地方,因为它会在下一个循环迭代中得到它。

所以具体的答案..。

  1. 是的,失败之处在于,如果值为== expected_value,则可能无法更新。
  2. 如果您确实需要以可靠的方式了解,请不要使用这些函数的弱版本。去找强者吧。
  3. 不,如果它不是期望值,它永远不会覆盖该值。
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41130990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档