# Sync(hronisation)

In Kapitel 5.7 beschäftigten wir uns mit den Funktionen `cue` und `sync, um Threads zu synchronisieren. Dort wurde allerdings nicht erklärt, was es mit dem Time State System auf sich hat, das diese Funktionalität zur Verfügung stellt. Tatsächlich ist` set`eine Variation von` cue`und baut auf die gleiche Kernfunktionalität auf, Informationen im Time State System zu hinterlegen. Zusätzlich ist` sync`so gestaltet, dass es einfach mit dem Time State funktioniert - es kann auf jegliche Information, die im Time State gespeichert ist, kann auch synchronisiert werden. Mit anderen Worten: wir synchronisieren auf Ereignisse, die im Time State gespeichert werden.

## Warten auf Ereignisse (Events)

Lass uns mal anschauen, wie man `sync`verwendet, 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 ‘:foo’ event zum Time State hinzugefügt wird. Nach dieser Threaderstellung (Deklaration) schlafen wir für 2 beats und dann setzen wir mit ‘set’-Befehl den ‘:foo’-Wert auf ‘1’. Diese Aktion ‘releases’ (beendet) den ‘sync’ und geht weiter zur nächsten Zeile, wo das ‘:ambi_lunar_land’-Sample getriggert wird.

Beachte, dass `sync` immer auf *zukünftige Ereignisse” wartet and den Thread genau an dieser Stelle so lange blockiert, bis das Ereignis eingetreten ist. Zusätzlich erbt der (gesyncte) Thread die logische Zeite des anderen Threads, der ihn mit Hilfe von `set` oder `cue` getriggert (angestossen) hat. Das heißt, dass man durch dieses Verfahren auch die Zeit von zwei Threads synchronisieren kann.

## Übergabe von Werten in die Zukunft

In diesem Beispiel setzen wir ‘:foo’ auf den Wert ‘1’, mit dem wir dann nichts gemacht haben. Diesen Wert können wir im Thread auch wieder abfragen (‘get’), in dem wir den Befehl ‘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. Das bedeutet, dass nur Werte übergeben werden dürfen, die sich in der Zukunft nicht verändern können wie zum Beispiel “unveränderliche Zeichenketten” (immutable strings), Zahlen, Symbole oder eingefrorene Zeichenketten (frozen strings). Sonic Pi wirft einen Fehler, falls ein Wert verwendet wird, der nicht dieser Vorgabe entspricht.