# Synchronisation

In Abschnitt 5.7 haben wir die Funktionen `cue` und `sync` vorgestellt, für die Synchronisierung von Threads. Was wir dort nicht erklärt haben ist, dass es das Time-State-System ist, das diese Funktionalität bereitstellt. Tatsächlich ist `set` eine Variation von `cue` und baut auf er selben Kernfunktion auf, Informationen im Time-State-System zu hinterlegen. Darüber hinaus ist `sync`so gestaltet, dass es unmittelbar mit Time-State arbeitet - jegliche Information, die wir zukünftig im Time State ablegen wollen, kann auch zur Synchronisierung verwendet werden. Mit anderen Worten - wir synchronisieren auf Ereignisse, die erst noch im Time-State gespeichert werden.

## Warten auf Ereignisse

Lass uns mal ansehen, wie `sync` verwendet wird, um auf neue Ereignisse zu warten, die dem Time-State hinzugefügt werden:

    in_thread do
      sync :foo
      sample :ambi_lunar_land
    end
    sleep 2
    set :foo, 1

In diesem Beispiel erstellen wir zuerst einen Thread, der darauf wartet, dass ein Ereignis ‘:foo’ dem Time-State hinzugefügt wird. Nach dieser Thread-Deklaration schlafen wir für 2 Schläge, und dann setzen wir mit ‘set’ den Wert für ‘:foo’ auf ‘1’. Dies entfernt `sync`, was dann auf die nächste Zeile übergeht, in der das ‘:ambi_lunar_land’-Sample getriggert wird.

Beachte, dass `sync` immer auf zukünftige Ereignisse wartet, und dass es den gegenwärtigen Thread blockieren wird, während es auf ein neues Ereignis wartet. Zusätzlich erbt es die logische Zeit des Threads, der es via `set` oder `cue` getriggert hat, sodass sich hierdurch auch die Zeit von zwei Threads synchronisieren lässt.

## Übergabe von Werten an die Zukunft

In diesem Beispiel setzen wir ‘:foo’ auf ‘1’, darüber hinaus haben wir damit nichts angefangen. Diesen Wert können wir im Thread tatsächlich abfragen (‘get’), indem wir `sync` aufrufen:

    in_thread do
      amp = sync :foo
      sample :ambi_lunar_land, amp: amp
    end
    sleep 2
    set :foo, 0.5

Beachte, dass Werte die mit Hilfe von `set` und `cue übergeben werden, thread-safe sein müssen - dies sind unveränderliche Ringe (immutable rings), Zahlen, Symbole oder eingefrorene Zeichenketten (frozen strings). Sonic Pi gibt einen Fehler aus, falls du einen Wert im Time-Store ablegen willst, der nicht gütig ist.