Home > Blockchain >  Atomic wait memory_order
Atomic wait memory_order

Time:07-09

I don't completely understand why atomic wait needs a memory order parameter. It compares its own value, so the atomic value itself is synchronized anyway. I couldn't figure out an example where anything else than std::memory_order_relaxed makes sense.

If I need additional logic based on the atomic variable I need to call other functions (with separate memory order specification) anyway, as wait is void, e.g.:

void waitToBeEmpty() noexcept
{
    ssize_t currSize{ m_queueSize.load(std::memory_order_acquire) };
    while (currSize > 0) {
        m_queueSize.wait(currSize, std::memory_order_relaxed);
        currSize = m_queueSize.load(std::memory_order_acquire);
    }
}

Why do we need to specify a memory order for atomic wait?

CodePudding user response:

If I need additional logic based on the atomic variable I need to call other functions

Do you?

Consider if T is a bool. It only has one of two states: true or false. If you wait until it is not true, then it must be false and no further atomic operations are needed.

And that's just the case where T is a type that can only (generally) assume two values. There are also cases where T is a type that technically can assume more values, but you're only using two of them. Or the cases where T could have multiple values, but your waiting code doesn't care which one it is, merely that it isn't the one you asked to wait on. "Is not zero" is a common example, as you may not care which kind of "not zero" it is.

  • Related