Я пишу навязчивый общий указатель и использую средства C++11 <atomic>
для счетчика ссылок. Вот соответствующие фрагменты моего кода :
//...
mutable std::atomic<unsigned> count;
//...
void
SharedObject::addReference() const
{
std::atomic_fetch_add_explicit (&count, 1u,
std::memory_order_consume);
}
void
SharedObject::removeReference() const
{
bool destroy;
destroy = std::atomic_fetch_sub_explicit (&count, 1u,
std::memory_order_consume) == 1;
if (destroy)
delete this;
}
. Сначала я начал с memory_order_acquire
и memory_order_release
, но потом убедил себя, что memory_order_consume
должно хватить. После дальнейших размышлений мне кажется, что даже memory_order_relaxed
должно работать.
Теперь вопрос в том, могу ли я использовать memory_order_consume
для операций, или я могу использовать более слабое упорядочение (memory_order_relaxed
), или я должен использовать более строгое упорядочение?