¿Por qué se necesita un límite de orden de memoria en el contador de referencia?
En el ejemplo deboost::atomic
, elunref
función:
void intrusive_ptr_release(const X * x)
{
if (x->refcount_.fetch_sub(1, boost::memory_order_release) == 1) {
boost::atomic_thread_fence(boost::memory_order_acquire);
delete x;
}
}
1: la operación fetch_sub está limitada pormemory_order_release, que evita que las operaciones anteriores se reordenen más allá del punto. ¿Pero cuáles son las posibles escenas que tendrían tal fenómeno?
2: además dememory_order_release en la operación atómica, por qué hay un adicionalmemory_order_acquire antes de la eliminación?