2.4.3.3.4. Trivial Mutex Using Futex
class mutex
{
  private:

    // Mutex state variable, zero means free.
    int val = 0;

  public:

    void lock ()
    {
      int old;

      // Atomically increment the state and
      // get the old value, which should be
      // zero if mutex was free.
      while ((old = atomic_inc (val)) != 0)
      {
        // The old value was not zero, meaning mutex was not free.
        // Wait unless the value has changed since the increment.
        futex_wait (&val, old + 1);
      }
    }

    void unlock ()
    {
      val = 0;
      // Wake a waiting caller if any.
      futex_wake (&val, 1);
    }
}
Source: Ulrich Drepper