Я пишу интрузивный общий указатель, и я использую средства С++ 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
) или использовать более строгий порядок?