我不确定是我不理解,还是文档没有清楚的表述。
以下摘录摘自最新草稿(N3126,第29.6节):
bool atomic_compare_exchange_weak(volatile A* object, C * expected, C desired);
bool atomic_compare_exchange_weak(A* object, C * expected, C desired);
bool atomic_compare_exchange_strong(volatile A* object, C * expected, C desired);
bool atomic_compare_exchange_strong(A* object, C * expected, C desired);
bool atomic_compare_exchange_weak_explicit(volatile A* object, C * expected, C desired, memory_order success, memory_order failure);
bool atomic_compare_exchange_weak_explicit(A* object, C * expected, C desired, memory_order success, memory_order failure);
bool atomic_compare_exchange_strong_explicit(volatile A* object, C * expected, C desired, memory_order success, memory_order failure);
bool atomic_compare_exchange_strong_explicit(A* object, C * expected, C desired, memory_order success, memory_order failure);
bool A::compare_exchange_weak(C & expected, C desired, memory_order success, memory_order failure) volatile;
bool A::compare_exchange_weak(C & expected, C desired, memory_order success, memory_order failure);
bool A::compare_exchange_strong(C & expected, C desired, memory_order success, memory_order failure) volatile;
bool A::compare_exchange_strong(C & expected, C desired, memory_order success, memory_order failure);
bool A::compare_exchange_weak(C & expected, C desired, memory_order order = memory_order_seq_cst) volatile;
bool A::compare_exchange_weak(C & expected, C desired, memory_order order = memory_order_seq_cst);
bool A::compare_exchange_strong(C & expected, C desired, memory_order order = memory_order_seq_cst) volatile;
bool A::compare_exchange_strong(C & expected, C desired, memory_order order = memory_order_seq_cst);
备注:弱比较和交换操作可能伪造地失败,即在操作前留下预期的内存内容时返回false,与操作后的对象相同,也与操作后预期的相同。[注意:这种虚假故障使比较和交换能够在更广泛的机器上实现,例如负载锁定存储条件机器。虚假失败的一个后果是,几乎所有弱比较和交换的使用都将处于一个循环中。
那么,这意味着什么?
首先,它“可能”是伪造的?!为什么会失败?他们是如何定义“可能”的?
其次,我仍然不知道带有"_strong“和"_weak”后缀的函数之间有什么区别。有人能解释一下这种区别吗?
编辑:,这就是我在libstdc++实现(atomic_0.h)中发现的:
bool compare_exchange_weak(
__integral_type& __i1,
__integral_type __i2,
memory_order __m1,
memory_order __m2
)
{
__glibcxx_assert(__m2 != memory_order_release);
__glibcxx_assert(__m2 != memory_order_acq_rel);
__glibcxx_assert(__m2 <= __m1);
return _ATOMIC_CMPEXCHNG_(this, &__i1, __i2, __m1);
}
bool compare_exchange_strong(
__integral_type& __i1,
__integral_type __i2,
memory_order __m1,
memory_order __m2
)
{
__glibcxx_assert(__m2 != memory_order_release);
__glibcxx_assert(__m2 != memory_order_acq_rel);
__glibcxx_assert(__m2 <= __m1);
return _ATOMIC_CMPEXCHNG_(this, &__i1, __i2, __m1);
}
发布于 2011-02-09 13:48:12
这与硬件实现的共享内存一致性模型有关。对于那些实现某种放松一致性模型(例如发布语义)的硬件体系结构,上面提到的强操作可能有很高的开销,因此专家可以使用较弱的形式来实现在这些轻松的一致性体系结构上也表现良好的算法。
有关更多信息,请参见。
http://www.hpl.hp.com/techreports/Compaq-DEC/WRL-95-7.pdf
http://kernel.org/pub/linux/kernel/people/paulmck/perfbook/perfbook.html中的第12章和附录C
发布于 2013-03-12 16:19:34
注释给出了一个线索,指的是LL/SC体系结构。来自维基百科的文章:
如果发生了任何更新,即使加载链接读取的值已经恢复,存储条件也肯定会失败。因此,LL/SC对比读取强,然后是比较交换(CAS),如果恢复了旧值,它将不会检测更新(参见ABA问题)。 如果内存位置没有并发更新,则LL/SC的实际实现并不总是成功的。这两个操作之间的任何异常事件,例如上下文切换、另一个负载链接,甚至(在许多平台上)另一个加载或存储操作,都将导致存储条件下的存储失败。
在LL/SC芯片上,compare_exchange
将以LL/SC的形式实现,这可能会出现伪造故障,因此compare_exchange_strong
需要额外的开销才能在失败的情况下重试。提供compare_exchange_strong
和compare_exchange_weak
允许程序员决定是希望库处理虚假的故障(在这种情况下,他们使用compare_exchange_strong
)还是希望在自己的代码中处理它(在这种情况下,他们使用compare_exchange_weak
)
https://stackoverflow.com/questions/4944771
复制相似问题