proxygen
folly::WaitOptions::Defaults Struct Reference

#include <WaitOptions.h>

Static Public Attributes

static constexpr std::chrono::nanoseconds spin_max
 

Detailed Description

Definition at line 32 of file WaitOptions.h.

Member Data Documentation

constexpr std::chrono::nanoseconds folly::WaitOptions::Defaults::spin_max
static
Initial value:
=
std::chrono::microseconds(2)

spin_max

If multiple threads are actively using a synchronization primitive, whether indirectly via a higher-level concurrent data structure or directly, where the synchronization primitive has an operation which waits and another operation which wakes the waiter, it is common for wait and wake events to happen almost at the same time. In this state, we lose big 50% of the time if the wait blocks immediately.

We can improve our chances of being waked immediately, before blocking, by spinning for a short duration, although we have to balance this against the extra cpu utilization, latency reduction, power consumption, and priority inversion effect if we end up blocking anyway.

We use a default maximum of 2 usec of spinning. As partial consolation, since spinning as implemented in folly uses the pause instruction where available, we give a small speed boost to the colocated hyperthread.

On circa-2013 devbox hardware, it costs about 7 usec to FUTEX_WAIT and then be awoken. Spins on this hw take about 7 nsec, where all but 0.5 nsec is the pause instruction.

Definition at line 54 of file WaitOptions.h.


The documentation for this struct was generated from the following files: