Synchronizační vzory 2

Download Report

Transcript Synchronizační vzory 2

Synchronizace – složitější vzory
• 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ě
menQueue.signal()
womenQueue.wait()
marry()
womenQueue.signal()
menQueue.wait()
marry()
mutex.wait()
if women > 0
women = women – 1
womenQueue.signal()
else
men = men + 1
mutex.signal()
menQueue.wait()
marry()
marriageDone.wait()
mutex.signal()
mutex.wait()
if men > 0
men = men – 1
menQueue.signal()
else
women = women + 1
mutex.signal()
womenQueue.wait()
marry()
marriageDone.signal()
• typické úlohy
• pro řešení se používají synchronizační vzory
•
rendez-vous, bariéra, turniket, fronta
•
•
•
•
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)
data = obtainData()
mutex.wait()
buffer.push(data)
items.signal()
mutex.signal()
items.wait()
mutex.wait()
data = buffer.pop()
mutex.signal()
processData(data)
data = obtainData()
mutex.wait()
buffer.push(data)
mutex.signal()
items.signal()
změna?
mutex.wait()
items.wait()
data = buffer.pop()
mutex.signal()
processData(data)
problém?
• 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í
data = obtainData()
spaces.wait()
mutex.wait()
buffer.push(data)
mutex.signal()
items.signal()
items.wait()
mutex.wait()
data = buffer.pop()
mutex.signal()
spaces.signal()
processData(data)