¿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?

Respuestas a la pregunta(1)

Su respuesta a la pregunta