В примере boost::atomic
функция unref
:
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: операция fetch_sub ограничена memory_order_release, что предотвращает переупорядочивание предыдущих операций после точки. Но каковы возможные сцены, которые могли бы иметь такое явление?
2: в дополнение к memory_order_release при атомарной операции, почему перед удалением есть дополнительный memory_order_acquire?
sub
— операция RMW. - person Kerrek SB   schedule 14.08.2014