Я все еще не уверен, что это я не понимаю, или документация четко не сформулирована. Следующий отрывок был взят из нового проекта (N3126, раздел 29.6):std :: atomic | compare_exchange_weak vs. compare_exchange_strong
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);
Замечание: Слабое сравнения и обмена операции может произойти сбой поддельно, что есть, вернуться ложным, оставляя содержание памяти, на которое указывает , ожидаемое до операции , такое же, как и у объекта , и то же, что и ожидаемое после операции. [Примечание: этот ложный отказ позволяет реализовать сравнение и обмену по более широкому классу машин , например, с загрузкой машин-условных машин. A Последствием ложного отказа является , что почти все виды использования слабых сравниваются и обмениваются в цикле .
Итак, что это значит? Во-первых, это может «не так» ложно ?! Почему это происходит? И как они определяют «может»? Во-вторых, я не знаю почему, но я до сих пор не знаю, в чем разница между функциями с суффиксами «_strong» и «_weak».
Надеюсь, что кто-нибудь может помочь;) С уважением.
EDIT: Вот что я нашел в 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);
}
Я добавил тэг STL, надеясь, что он принесет Ховарда Хиннанта там, он работает над их внедрением в libC++, поэтому он должен знать об этом. –