【发布时间】:2011-06-24 02:32:20
【问题描述】:
我不确定是我不理解还是文档没有明确表述。
以下摘自最新草案(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++-implementation (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);
}
【问题讨论】:
-
我添加了 STL 标签,希望它能把 Howard Hinnant 带到那里,他一直在努力在 libc++ 中实现这些,所以他应该知道。
标签: c++ stl c++11 atomic c++-standard-library