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