我对std::atomic::compare_exchange_weak的虚假失败感到困惑。
编辑:为了澄清第三点:我不是指由CAS更改变量值本身,而是指更改“预期”参数引用。问题是compare_exchange_weak是否更改了对变量当前值的引用--无论是一般情况还是在出现虚假故障的情况下。我之所以这样做,是因为我的代码假设在CAS之后,“预期”参数保存当前值。(根据我对第二个问题的回答,我认为答案是“预期”论点在弱版本中从未更新过。对吗?)
发布于 2016-12-13 21:45:32
1)是。这是虚假失败的定义:它的作用就好像实际价值不等于预期的那样,即使它们是。
2)如果您必须知道或确保不发生虚假故障,请使用compare_exchange_strong。
( 3)不。但事实并非如此。这将违反合同:只在real == expected中写入,但它将将值加载到expected,即使它是相同的:
N3797 atomics.types.operations.req/25评论:弱的比较和交换操作可能会伪造地失败.也就是说,即使预期和对象所引用的内存内容相等,它也可能返回false,并将原来存在的内存内容存储回预期的内存内容。
发布于 2016-12-13 21:47:11
弱交换函数可能无法更新,以便在引擎盖下具有更高的性能实现。它们通常用于循环检查,而在不太重要的地方,因为它会在下一个循环迭代中得到它。
所以具体的答案..。
https://stackoverflow.com/questions/41130990
复制相似问题