10.2 Synchronisation

# 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.
