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()
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()
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() data = buffer.pop buffer.push(data) 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)
Zdroj obrázku: http://www. adamweitz