To není žádný global lock, je to jeden konkrétní mutex. I v Haskellu to bude interně implementováno nějakým zámkem (pokud na to nebudou stačit atomické operace), nebo nějakou post sychronizací více transakcí (to si moc nedokážu představit, ale asi by to taky šlo).
Je to implementováno tak, že se v atomic bloku při přístupu k TVarům zapisuje transakční log a na konci transakce se to zpracuje. Teď koukám do svého kódu - např. jsem potřeboval napsat, aby došlo k restartům některých threadů v případě změny konfigurace. Konfiguraci mám v TVaru. Kód:
tvarWatcher = do
config <- atomically $ readTVar confTvar
restartServices config
atomically $ do
newconf <- readTVar confTvar
unless (config /= newconf) retry
tvarWatcher
Žádná nutnost pro nějaké signály, broadcasty apod.
V C++ to v reálné implementaci zapouzdříš do nějaké třídy, ve které budou ty proměnné i mutex. Taky na to zvenku nikdo nesáhne.
Jasně, a přístup ke dvěma takovým proměnným ti rozhodně nikdy nezpůsobí deadlock...
Něco takového?
Ne, můj kód čeká požadovaný timeout, zda-li se v té době podmínka nesplní. Tvůj ne. Tohle přes zámky neuděláš, na to potřebuješ condition variable... se 2ma proměnnýma. Lahůdka.