Sincronización (Sync)

La sección 5.7 introdujo las funciones cue y sync para lidiar con el problema de sincronización de hilos. Lo que no explicó fue que es el sistema Time State es quien provee esta funcionalidad. Resulta que set es solo una variante de cue y está construido sobre la misma funcionalidad base la cual es insertar información en el sistema Time State. Adicionalmente, sync tambien está diseñado de tal manera que funcione sin líos con Time State - podemos sincronizarnos conrespecto a cualquier información que planeemos almacenar en Time State. En otras palabras - Usamos sync sobre eventos prontos a insertarse en Time State.

Esperando eventos

Echemos un vistazo rápido de como usar sync para esperar a que nuevos eventos sean agregados a Time State:

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

En este ejemplo primero creamos un hilo que espera a que un evento :foo sea añadido al Estado de Tiempo. Después de la declaración de este hilo, dormimos durante 2 tiempos y luego set-emos :foo a 1. Esto libera el sync que pasa a la siguiente línea que es la de activar la muestra :ambi_lunar_land.

Ten en cuenta que sync siempre espera a eventos futuros y que va a bloquear el hilo de ejecución actual mientras espera al nuevo evento. Ademas, va a heredar el tiempo lógico del hilo que lo usó mediante set o cuede tal manera de que puede ser usado para sincronizar tiempo.

Pasar valores hacia el futuro

En el ejemplo anterior hemos puesto :foo a 1 con el que no hemos hecho nada. En realidad podemos obtener este valor del hilo que llama a sync:

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

Note that values that are passed through set and cue must be thread safe - i.e. immutable rings, numbers, symbols or frozen strings. Sonic Pi will throw an error if the value you are attempting to store in the Time State is not valid.