C++11 atomics и интрузивный общий указатель ссылок

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

18
задан wilx 22 April 2012 в 14:29
поделиться