AtomicBackoff#

Fully qualified name: carb::thread::AtomicBackoff

Defined in carb/thread/Util.h

template<size_t PausesBeforeYield = 16>
class AtomicBackoff#

A utility class for providing a growing number of pause instructions, followed by yielding.

The pause instruction is effectively CARB_HARDWARE_PAUSE().

Very fast to construct, often used in a loop such as:

for (AtomicBackoff<> b;; b.pause())
    if (condition())
        break;

Template Parameters:

PausesBeforeYield – the number of pauses that will occur before yielding begins. See AtomicBackoff::pause().

Public Functions

constexpr AtomicBackoff() noexcept = default#

Constructor.

inline void reset() noexcept#

Resets *this.

inline void pause() noexcept#

Every time called, will pause for exponentially longer, and after a certain amount will instead yield.

Pause is as via CARB_HARDWARE_PAUSE. Yield is as via std::this_thread::yield(). The pause count starts at 1 when reset() or newly constructed. Each time this function is called, the CPU pause instruction is executed count times and count is doubled. If called when count exceeds kPausesBeforeYield, a yield occurs instead. Calling reset() resets the count to 1.

inline bool pauseWithoutYield() noexcept#

Similar to pause() but if would yield, instead returns false.

Returns:

true if the internal count is less than kPausesBeforeYield; false otherwise.

Public Static Functions

static inline void pauseLoop(size_t count) noexcept#

A helper function for executing the CPU pause instruction count times.

Parameters:

count – The number of times to execute CARB_HARDWARE_PAUSE().

Public Static Attributes

static constexpr size_t kPausesBeforeYield = PausesBeforeYield#

The number of pauses that should be executed before yielding the thread.