私が理解していないのか、ドキュメントが明確に定式化されていないのかはわかりません。
次の抜粋は、最新のドラフト (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);
注意: 弱い比較交換操作は誤って失敗する可能性があります。つまり、操作がオブジェクトの内容と同じであり、操作後の期待値と同じである前に、expected が指すメモリの内容を残したまま、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);
}