syscalls aren&#x27;t public API on Darwin platforms (e.g. iOS, OS X). The only supported interface to syscalls is libc&#x2F;libsystem. And I&#x27;m not aware of any equivalent to futex. So AFAIK there&#x27;s no way to implement a userspace mutex that isn&#x27;t just a wrapper around a system-provided mutex (e.g. pthread_mutex, or a serial libdispatch queue). And if you&#x27;re wrapping pthread_mutex, adding a spinlock doesn&#x27;t provide any benefit.<p>FWIW, libdispatch itself definitely uses Mach SPI. For example, skimming through the source, it calls thread_switch() using a non-public option (there&#x27;s 3 non-public options to thread_switch now, two of which are intended for dealing with the QOS issues that my article talked about; the private os_lock_handoff_s that the objc runtime uses internally uses one called SWITCH_OPTION_OSLOCK_WAIT and libdispatch appears to use the other, SWITCH_OPTION_OSLOCK_DEPRESS, as well as the third option which was added just for libdispatch called SWITCH_OOPTION_DISPATCH_CONTENTION).