# Sync (synchroniseren)

Sectie 5.7 introduceerde de functies `cue` en `sync` om het synchroniseren van threads af te handelen. Wat niet werd uitgelegd is dat het het tijd toestand systeem is dat deze functionaliteit beschikbaar stelt. Eigenlijk is `set` een variatie op `cue` en bouwt voort op dezelfde kernfunctionaliteit: het toevoegen van informatie aan het tijd toestand systeem. Bovendien is `sync` ook zo ontworpen dat het naadloos samenwerkt met de tijd toestand - alle informatie die we van plan zijn op te slaan in de tijd toestand waarop we kunnen synchroniseren. Met andere woorden - * we `sync`-en op gebeurtenissen die nog moeten worden ingevoegd in de tijd toestand *.

## Wachten op gebeurtenissen

Laten we kort kijken naar hoe `sync` gebruikt wordt om op nieuwe gebeurtenissen te wachten die worden toegevoegd aan tijd toestand:

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

In dit voorbeeld maken we eerst een draad die wacht op een ‘:foo’-gebeurtenis die toegevoegd wordt aan de Time State. Nadat we deze draad aangekondigd hebben, slapen we twee slagen en dan zetten we (‘set’) ‘foo’ op ‘1’. Dat zorgt er vervolgens voor dat de ‘sync’ vrijgegeven wordt zodat op de volgende regel het ‘:ambi_lunar_land’-stukje geactiveerd wordt.

Let erop, dat ‘sync’ altijd wacht op toekomstige gebeurtenissen, en dat het de huidige draad blokkeert zolang die gebeurtenis nog niet opgetreden is. Bovendien erft het de logische tijd van de draad die hem geactiveerd heeft via de ‘set’ of ‘cue’, zodat het gebruikt kan worden om de tijd te synchroniseren.

## Doorgeven van waarde aan de toekomst

In het bovenstaande voorbeeld is ‘:bla’ op ‘1’ gezet om er vervolgens niets mee te doen. We kunnen de waarde ophalen van de thread door ‘sync’ aan te roepen:

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

Let erop, dat waarde die via ‘set’ en ‘cue’ doorgegeven worden ‘thread safe’ moeten zijn. Dat wil zeggen dat de waarden niet opeens gewijzigd mogen kunnen worden. Voorbeelden van toegestane waardetypes zijn onveranderlijke tekenreeksen (‘immutable strings’), getallen, symbolen of bevroren tekenreeksen (‘frozen strings’). Sonic Pi geeft een foutmelding als je een waarde gebruikt die niet aan die voorwaarde voldoet.