150 likes | 267 Views
Paralelní programování. Synchronizace – složitější vzory. 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
E N D
Paralelní programování Synchronizace – složitější vzory
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ě
Smí pokračovat v párech • menQueue.signal() • womenQueue.wait() • marry() • womenQueue.signal() • menQueue.wait() • marry()
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() • mutex.signal()
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()
Synchronizační problémy • typické úlohy • pro řešení se používají synchronizační vzory • rendez-vous, bariéra, turniket, fronta
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() • buffer.push(data) • data = buffer.pop • processData(data)
Producent • data = obtainData() • mutex.wait() • buffer.push(data) • items.signal() • mutex.signal()
Konzument • items.wait() • mutex.wait() • data = buffer.pop() • mutex.signal() • processData(data)
Producent 2 • data = obtainData() • mutex.wait() • buffer.push(data) • mutex.signal() • items.signal() změna?
Konzument • mutex.wait() • items.wait() • data = buffer.pop() • mutex.signal() • processData(data) problém?
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í
Producent • data = obtainData() • spaces.wait() • mutex.wait() • buffer.push(data) • mutex.signal() • items.signal()
Konzument • items.wait() • mutex.wait() • data = buffer.pop() • mutex.signal() • spaces.signal() • processData(data)