Kapitola 9
Události Nástroje, které jsme využívali v předchozích kapitolách, umožňovaly připravit k běhu blokovaná vlákna. Avšak jedna data ve frontě či jeden semafor ve výsledku vždy umožnily aktivaci pouze jednomu vláknu. K hromadné změně více vláken do připraveného stavu slouží události (anglicky Events).
9.1
Funkce
Událost je nástroj operačního systému, který umožňuje naráz uvést více vláken do připraveného stavu. Jelikož tento nástroj nepracuje pouze s jednou událostí, ale rovnou s celou sadou, je také možné nastavit, aby každé vlákno čekalo v blokovaném stavu na jinou událost, nebo na kombinaci více událostí. Skupinu událostí si můžeme představit jako 32bitové slovo, z něhož jeho nejnižších 24 bitů představuje příznaky jednotlivých událostí. Jednotlivé příznaky událostí nemají žádné speciální funkce. Záleží pouze na programátorovi, jak jednotlivé bity využije. Události výrazně snižují paměťovou náročnost na synchronizaci vláken. 24 bitů událostí totiž můžeme použít podobným způsobem jako 24 semaforů, které ovšem zaberou mnohem více paměťového prostoru. Jeden semafor navíc dokáže odblokovat pouze jedno vlákno, zatímco událost může uvést do připraveného stavu vláken více. Chceme-li vygenerovat událost, stačí pouze daný příznak události (bit ve 32bitovém slově událostí) nastavit do logické jedničky. Na generování událostí a na čekání na události se využívají knihovní funkce operačního systému. Jejich praktické použití ilustruje následující příklad.
9.1.1
Příklad 19 – skupina událostí
V tomto příkladu si ukážeme, jak může naráz reagovat více vláken na jednu, nebo skupinu událostí. V našem příkladu budou dohromady čtyři vlákna. Dvě vlákna s nízkou prioritou budou generovat události. Další dvě vlákna s vysokou prioritou budou na události či jejich kombinace reagovat. První vlákno s nízkou prioritou bude generovat událost1, po 500 ms vygeneruje událost2, po dalších 500 ms opět událost1, a tak stále dokola. Druhé vlákno vždy po sekundě vygeneruje událost3. Vlákna s vysokou prioritou budou čekat na události. První vlákno bude reagovat na událost1 nebo událost2. Pokud některá z nich nastane, vlákno opustí blokovaný stav a podle toho, která událost nastala, odešle buď znak "a"nebo znak "b". Druhé vlákno bude reagovat pouze v momentě, kdy je vygenerována událost1 a zároveň událost3. V ten moment odešle znak "c". Obě vlákna po přečtení události nulují jejich příznaky. Také vytvoříme příznaky událostí a ukazatel na skupinu událostí.
91 Ukázka elektronické knihy, UID: KOS521714