Spinlock (auch Sperre mit aktivem Warten oder busy waiting) ist eine Synchronisations-Technik, bei der ein wartender Thread so lange in einer engen Schleife läuft und die Sperrvariable immer wieder abfragt, bis sie frei wird. Statt zu schlafen und auf den Scheduler zu warten, "dreht" der Thread — er spinnt.

Wie ein Spinlock funktioniert

Ein Spinlock besteht aus einem einzelnen Speicherwort, das per atomarer Operation wie Test-and-Set oder Compare-and-Swap gesetzt wird. Solange ein anderer Thread die Sperre hält, pollt der wartende Thread das Wort in einer Schleife:

while (test_and_set(&lock) == 1) {
    /* warten, kurz Pause einlegen */
    __asm__("pause");
}

Die pause-Anweisung (x86) schonet die CPU und den Stromverbrauch, weil sie die Spekulation des Prozessors unterbricht.

Wann ein Spinlock sinnvoll ist

  • Sehr kurze kritische Abschnitte: Wenn der geschützte Code nur wenige Instruktionen dauert, ist das Spinnen oft schneller als der komplette Kontextwechsel eines blockierenden Mutex.
  • Mehrkern-Systeme: Nur wenn ein anderer Kern parallel läuft, kann er die Sperre überhaupt freigeben, während gewartet wird. Auf einem Ein-Kern-System ohne Unterbrechung wäre ein Spinlock gefährlich: Der Thread mit der Sperre bekäme keine CPU-Zeit.
  • Interrupt-Kontext im Kernel: Im Kernel darf man in Interrupt-Handlern oft nicht blockieren — dort sind Spinlocks (etwa spin_lock()/spin_unlock() in Linux) das Mittel der Wahl.

Varianten

Naive Spinlocks sind unfair: Ein Thread kann "verhungern", während andere sich vordrängeln. Das Ticket-Lock löst das mit einer Nummernvergabe (jeder Thread bekommt eine Nummer, Bedienung in Reihenfolge). Das MCS-Lock (nach Mellor-Cummins und Scott, 1991) reiht die wartenden Threads in eine Warteschlange ein und ist cache-freundlich; in dieser Form nutzt auch der Linux-Kernel sein qspinlock. Viele Systeme kombinieren außerdem beides zu Hybrid-Sperren: erst kurz spinnen, dann blockieren.

Abgrenzung zum Mutex

Der Mutex legt einen wartenden Thread schlafen und überlässt die CPU dem Scheduler — das kostet einen Kontextwechsel, verschwendet aber keine Rechenzeit. Der Spinlock dreht aktiv und reagiert dadurch schneller, verbrennt dafür aber CPU-Zeit. Höhere Synchronisations-Werkzeuge wie Monitore bauen intern meist auf atomaren Operationen oder Mutex-artigen Sperren auf.