# Sincronização (Sync)

A secção 5.7 introduziu as funções `cue` e `sync` para lidar com problemas de sincronização de threads. O que não foi explicado é que é o sistema de Time State que fornece esta funcionalidade. É de tal forma que `set` é uma variação de `cue`e foi construído de forma que possa trabalhar perfeitamente com o Time State - qualquer informação que nós planeamos armazenar no Time State nós podemos sincronizar. Em outras palavras - nós sincronizamos `sync`eventos que ainda serão inseridos no Time State.

## Aguardando por eventos

Vamos dar uma olhada em como usar `sync` para esperar por novos eventos que serão inseridos ao Time State:

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

Neste exemplo nós primeiro criamos uma thread que espera um evento `:foo` ser adicionado ao Time State. Após a declaração desta thread, nós esperamos por 2 batidas e então setamos (`set`) `:foo` para ser `1`. Isso libera a sincronização (`sync`) que então segue para a próxima linha que dispara a amostra `:ambi_lunar_land`.

Note que `sync` sempre espera por eventos futuros e isso irá bloquear a a thread atual esperando por um novo evento. Também, irá herdar o tempo lógico da thread que chamou a sincronização através de `set` ou `cue` então pode também ser usado para sincronizar tempo.

## Passando valores para o Futuro

No exemplo acima nós configuramos `:foo` igual a `1` e não fizemos nada com isso. Nós podemos, na verdade, recuperar este valor na thread chamando `sync`:

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

Note que valores que são passados através de `set` e `cue` devem ser seguros - i.e. Rings imutáveis, números, símbolos ou strings congeladas. O Sonic Pi irá gerar um erro se o valor que está a tentar armazenar no Time State não for válido.