# 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 `cue`de 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.