140 likes | 330 Views
Paralelní programování. Synchronizační vzory – bariéra. Synchronizační vzory – mutex. kolik semaforů? jaká počáteční hodnota?. Synchronizační vzory – mutex. kritická sekce acquire = wait, release = signal multiplex?. Synchronizační vzory – multiplex. semafor <> zámek
E N D
Paralelní programování Synchronizační vzory – bariéra
Synchronizační vzory – mutex • kolik semaforů? • jaká počáteční hodnota?
Synchronizační vzory – mutex • kritická sekce • acquire = wait, release = signal • multiplex?
Synchronizační vzory – multiplex • semafor <> zámek • token, místnost, povolenka, permanentka • symetrické
Synchronizační vzory – bariéra • symetrické rendezvous pro libovolný počet vláken • všechna vlákna musí počkat až projdou bodem setkání • po příchodu posledního vlákna mohou všichni pokračovat dál • realizace • n vláken • poslední vlákno otevře bariéru
Synchronizační vzory – bariéra • mutex.wait() • count = count + 1 • mutex.signal() • if count == n • barrier.signal() • barrier.wait() kdy funguje? kdy nefunguje?
Bariéra – turniket • mutex.wait() • count = count + 1 • mutex.signal() • if count == n • barrier.signal() • barrier.wait() • barrier.signal()
Synchronizační vzory – bariéra • praktické využití • pracovní vlákna • po dokončení práce se výsledky spojí • rozdá se nová práce • spouští se v cyklu • potřebujeme bariéru, kterou lze znovu použít • wait v kritické sekci (uvnitř mutexu) je nepoužitelný • turniket – bod, kterým vlákna prochází po jednom, ale bez zdržení
Deadlock - drobná chybka • mutex.wait() • count = count + 1 • if count == n • barrier.signal() barrier.wait() • barrier.signal() • mutex.signal()
Bariéra – další (ne)řešení • mutex.wait() • count = count + 1 • mutex.signal() • if count == n • turnstile.signal() • turnstile.wait() • turnstile.signal() • mutex.wait() • count = count – 1 • mutex.signal() • if count == 0 • turnstile.wait(); problem?
Bariéra – další řešení • mutex.wait() • count = count + 1 • if count == n • turnstile2.wait() • turnstile.signal() • mutex.signal() • turnstile.wait() • turnstile.signal() • /* process */ • mutex.wait() • count = count – 1 • if count == 0 • turnstile.wait(); • turnstile2.signal(); • mutex.signal() • turnstile2.wait() • turnstile2.signal(); počáteční hodnoty?
Bariéra – další řešení • mutex.wait() • count = count + 1 • if count == n • turnstile.signal(n) • mutex.signal() • turnstile.wait() • /* process */ • mutex.wait() • count = count – 1 • if count == 0 • turnstile2.signal(n); • mutex.signal() • turnstile2.wait()