Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
1
Paralelní programování
Synchronizace – složitější vzory
2
Synchronizační vzory – fronta
máme dva druhy vláken pokračovat smí jen v párech 2 varianty smí pokračovat v párech danou činnost může vyvíjet n vláken současně ale budou stejné počty stejných typů musí pokračovat v párech tj. danou činnost smí vyvíjet pouze dvě vlákna současně
3
Smí pokračovat v párech
menQueue.signal() womenQueue.wait() marry() womenQueue.signal() menQueue.wait()
4
Musí pokračovat v párech – muž
mutex.wait() if women > 0 women = women – 1 womenQueue.signal() else men = men + 1 mutex.signal() menQueue.wait() marry() marriageDone.wait()
5
Musí pokračovat v párech – žena
mutex.wait() if men > 0 men = men – 1 menQueue.signal() else women = women + 1 mutex.signal() womenQueue.wait() marry() marriageDone.signal()
6
Synchronizační problémy
typické úlohy pro řešení se používají synchronizační vzory rendez-vous, bariéra, turniket, fronta
7
Producent – konzument více producentů více konzumentů
sdílená paměť – buffer konzument odebírá data z paměti k paměti může přistupovat pouze jeden čtení i zápis je exkluzivní data = obtainData() data = buffer.pop buffer.push(data) processData(data)
8
Producent data = obtainData() mutex.wait() buffer.push(data)
items.signal() mutex.signal()
9
Konzument items.wait() mutex.wait() data = buffer.pop() mutex.signal()
processData(data)
10
Producent 2 data = obtainData() mutex.wait() buffer.push(data)
mutex.signal() items.signal() změna?
11
Konzument mutex.wait() items.wait() data = buffer.pop() mutex.signal()
processData(data) problém?
12
Producent – konzument – konečný
Reálně má buffer konečnou kapacitu v případě producent2 ani neznáme aktuální obsazení bufferu pokud je buffer plný, musí producenti čekat na uvolnění pokud je buffer prázdný, musí konzumenti čekat na naplnění
13
Producent data = obtainData() spaces.wait() mutex.wait()
buffer.push(data) mutex.signal() items.signal()
14
Konzument items.wait() mutex.wait() data = buffer.pop() mutex.signal()
spaces.signal() processData(data)
15
Zdroj obrázku: http://www. adamweitz
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.