Aún no estoy seguro si soy yo el que no entiende o si la documentación no está claramente formulada. El siguiente extracto ha sido tomado de la más reciente proyecto (N3126, sección 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);
Observación: La debilidad de comparación y el intercambio operaciones pueden fallar falsamente, que es decir, volver falsa, dejando el contenido de la memoria señalada por esperado antes de la operación es el mismo que el del objeto y el mismo que el esperado después de la operación. [Nota: esta falsa falla de permite la implementación de compare-and-exchange en una clase más amplia de máquinas , por ejemplo, máquinas de almacenamiento condicional de cargadas a máquina. Una consecuencia de falla espuria es que casi todos los usos de débil comparar y cambiar estarán en un bucle .
Entonces, ¿qué significa esto? En primer lugar, 'puede' faild falsamente ?! Por qué lo hace? ¿Y cómo definen 'pueden'? En segundo lugar, no sé por qué, pero todavía no tengo idea de cuál es la diferencia entre las funciones con el sufijo "_strong" y "_weak".
Espero que alguien pueda ayudar;) Saludos cordiales.
EDIT: Eso es lo que he encontrado en libstdC++ - aplicación (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);
}
Agregué la etiqueta STL, con la esperanza de que traerá a Howard Hinnant allí, ha estado trabajando en la implementación de estos en libC++, por lo que debería saberlo. –