Futex-based spinlocks do what, 1000 spin cycles before actually futex(2)ing?
If the holder of the lock got preempted you could be spinning for a very long time.
> You really should only use a spinlock if you can disable preemption, which is usually limited to the kernel or realtime processes.
Oh god, no, don't do that. Then you could livelock if you don't do a hybrid strategy, because you are totally hosed if all your cores enter the unpreemptable spin sequence.
Maybe you are thinking of a different scenario, where the thread is preempted in the spinloop, but the kernel thinks it is runnable and at some future time just reschedules it, and it then continues to spin. That can happen, but the thread should break out of its spinloop and block anyway if the spinlock is tuned properly, so at most you just broke up the spinning across reschedules, and haven't fundamentally made anything worse. In an ideal world, if the kernel preempts a thread in a spinloop, it should transition it directly into the waiting state, and not reschedule it until it can acquire the lock. But since spinloops are in userspace, the kernel usually has no idea what is going on.
You might want to read https://webkit.org/blog/6161/locking-in-webkit/ about how Chrome implements high performance locks.