# Sync

Sekcja 5.7 wprowadziła funkcje `cue` i `sync`, mieliśmy wtedy do czynienia z problemem synchronizacji wątków. To co nie zostało wytłumaczone to fakt, że funkcjonalność ta jest zapewniona przez system Stanu Czasu (Time State). Tak się właśnie dzieje gdyż funkcja `set` jest w zasadzie wariacją funkcji `cue` i jest zbudowana na bazie tej samej podstawowej funkcjonalności, która pozwala na umieszczenie informacji w systemie Stanu Czasu. Ponadto, `sync` jest również zaprojektowany w taki sposób, że działa bezproblemowo z Stanem Czasu - do każdej informacji, którą chcielibyśmy umieścić w Stanie Czasu, możemy się zsynchronizować. Innymi słowy - synchronizujemy się (`sync`) na zdarzeniach, które będą umieszczone w Stanie Czasu.

## Czekając na Zdarzenia

Spróbujmy spojrzeć szybko jak należy używać polecenia `sync` aby móc poczekać aby nowe zdarzenia zostały dodane do Stanu Czasu (Time State):

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

W tym przykładzie najpierw tworzymy wątek, który czeka na zdarzenie `:foo` aby można go było dodać do Stanu Czasu. Po zadeklarowaniu tego wątku śpimy przez 2 uderzenia i następnie ustawiamy (`set`) `:foo` na wartość `1`. To z kolei zwalnia `sync` co pozwala na przeniesienie się do kolejnej linii, w której zostaje wywołany sampel `:ambi_lunar_land`.

Zauważ, że funkcja `sync` zawsze czeka na przyszłe zdarzenia, i że zablokuje on aktualny wątek w oczekiwaniu na kolejne zdarzenie. Ponadto, odziedziczy ona czas logiczny wątku, który wywołał ją poprzez funkcję `set` lub `cue`, więc może też być używana do synchronizowania czasu.

## Przekazywanie wartości w Przyszłość

W przykładzie powyżej nadajemy `:foo` wartość `1` i nic z nią nie robimy. Możemy właściwie pobrać tę wartość wewnątrz wątku korzystając z `sync`:

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

Zauważ, że wartości które są przekazywane do funkcji `set` i `cue` muszą być bezpieczne dla wątków - np. niezmienne pierścienie (rings) liczby, symbole lub zamrożone łańcuch znaków (strings). Sonic Pi rzuci błąd jeśli wartość którą próbujesz umieścić w Stanie Czasu (Time State) jest niepoprawna.