Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
Synchronizace
11/4/2020 vjj 1
Synchronizace
film - obraz a zvuktanec
automatická plnící linka
11/4/2020 vjj 2
Synchronizace
• čeho ?!?!?!
• dvou (a více) paralelně běžících procesů(studenti střídající se v labu PC)
• dvou (a více) paralelně běžících vláken jednoho procesu(jeden účet na společném notebooku)
• dvou (a více) paralelně běžících vláken dvou (a více) procesů(cloud pro sdílení dat)
11/4/2020 vjj 3
Synchronizace
• proč ?!?!?!
• sdílení prostředků
• čekání na zprávu, že data jsou připravena(autor píše článek a vybírá vhodné ilustrace a výsledek pošle do sdíleného uložiště v cloudu,grafik potom upravuje celkový vzhled článku)
• exkluzivní práce se sdílenými daty (kritické sekce)(dva autoři se střídají v práci na společném článku)
11/4/2020 vjj 4
synchronizace I.
• 1. proces / vlákno
Signalizace(že data jsou už připravena)
• 2. proces / vlákno
Čekání(až budou data připravena)
11/4/2020 vjj 5
příkladF1 (X)
{
...
X = výsledek
}
main (. . . )
{F1(A) // výpočet A nezávislý na B
F2(B) // výpočet B nezávislý na A
F3(A,B)}
11/4/2020 vjj 6
F2 (X)
{
...
X = výsledek
}
příkladF1 (X)
{
...
X = výsledek
}
main (. . . )
{F2(B) // výpočet B nezávislý na A
F1(A) // výpočet A nezávislý na B
F3(A,B)}
11/4/2020 vjj 7
F2 (X)
{
...
X = výsledek
}
problém
main (. . . )
{
...
čekej na F1 a F2
F3(A,B)}
11/4/2020 vjj 8
F1(A) ; F2(B) ;
F1 (X)
{
...
X = výsledek
}
F2 (X)
{
...
X = výsledek
}
MAINF1 F2
WAIT
round-robin
• Main, F1 a F2 se stále točí v Round-Robinu společně s ostatními vlákny
11/4/2020 vjj 9
to umí každýF1 (X)
{ ...
X = výsledek
HOTOVO1 = TRUE
}
main (. . . )
{ bool HOTOVO1 = FALSE
bool HOTOVO2 = FALSE
while ( ! ( HOTOVO1 and HOTOVO2 ) )
F3(A,B)}
11/4/2020 vjj 10
F2 (X)
{ ...
X = výsledek
HOTOVO2 = TRUE
}
F1(A) F2(B)
malé vylepšeníF1 (X)
{ ...
X = výsledek
HOTOVO1 = TRUE
}
main (. . . )
{ bool HOTOVO1 = FALSE
bool HOTOVO2 = FALSE
while ( ! ( HOTOVO1 and HOTOVO2 ) ) Sleep(...)
F3(A,B)}
11/4/2020 vjj 11
F2 (X)
{ ...
X = výsledek
HOTOVO2 = TRUE
}
F1(A) F2(B)
round-robin
• Main, F1 a F2 se stále točí v Round-Robinu společně s ostatními vlákny, jen Main nespotřebovává pokaždé celé kvantum
11/4/2020 vjj 12
ale jde to i jinakF1 (X)
{ ...
X = výsledek
SetEvent (HOTOVO1)
}
main (. . . )
{ event HOTOVO1 = CreateEvent (..., false, ...)
event HOTOVO2 = CreateEvent (..., false, ...)
Wait ( HOTOVO1, HOTOVO2 )
F3(A,B)}
11/4/2020 vjj 13
F2 (X)
{ ...
X = výsledek
SetEvent (HOTOVO2)
}
F1(A) F2(B)
round-robin
• F1 a F2 se stále točí v Round-Robinu společně s ostatními vlákny, ale Main odpočívá mezi čekajícími vlákny
11/4/2020 vjj 14
a ještě jinakF1 (X)
{
...
X = výsledek
}
main (. . . )
{myThread1 = CreateThread (. . . , F1, A, . . )
myThread2 = CreateThread (. . . , F2, B, . . )
Wait (myThread1, myThread2 )
F3(A,B)} ;
11/4/2020 vjj 15
F2 (X)
{
...
X = výsledek
}
EventHANDLE CreateEvent
(LPSECURITY_ATTRIBUTES lpsa,BOOL bManualReset,BOOL InitialState,LPCTSTR lpszName) ;
HANDLE OpenEvent(DWORD fdwAccess,BOOL fInherit,LPCTSTR lpszName) ;
11/4/2020 vjj 16
Event
• Wait...
• manuální - zůstane nastaven
• automatický - zruší se nastavení
BOOL SetEvent (hEvent) ;
BOOL ResetEvent (hEvent) ;
11/4/2020 vjj 17
AutoResetEventstatic AutoResetEvent autoEv =
new AutoResetEvent (false) ;
• po zasignalizování propustí jedno vlákno a opět přejde do nesignalizovaného stavu
autoEv . Set () ; autoEv . WaitOne () ; autoEv . WaitOne (int ms, false) ;autoEv . Reset () ;
11/4/2020 vjj 18
ManualResetEventstatic ManualResetEvent autoEv =
new ManualResetEvent (false) ;
• po zasignalizování propouští všechna vlákna dokud není explicitně resetován
autoEv . Set () ; autoEv . WaitOne () ;autoEv . WaitOne (int ms, false) ;autoEv . Reset () ;
11/4/2020 vjj 19
Pulse
• Wait...
• manuální - všichni
• automatický - první
BOOL PulseEvent (hEvent) ;
11/4/2020 vjj 20
synchronizace II.
11/4/2020 vjj 21
kritické sekce• 1. proces / vlákno
. . .
práce na společném článku
. . .
• 2. proces / vlákno
. . .
práce na společném článku
. . .11/4/2020 vjj 22
problém
main (. . . )
{
...
}
11/4/2020 vjj 23
F1() ; F2() ;
F1 ()
{
práce na společném článku
}
F2 ()
{
práce na společném článku
}
MAIN
F1 F2
round-robin
• Main, F1 a F2 se stále točí v Round-Robinu společně s ostatními vlákny
11/4/2020 vjj 24
kritické sekce• 1. proces / vlákno
Wait ... až nebude na článku pracovat nikdo jiný
práce na společném článku
Release . . .
• 2. proces / vlákno
Wait ... až nebude na článku pracovat nikdo jiný
práce na společném článku
Release . . .
11/4/2020 vjj 25
binární semafor• Dijkstra
• proměnná typu integer
• hodnota 1 znamená volno/pokračuj
• hodnota 0 znamená obsazeno/čekej
• Wait(S) :if S = 0 (zavřeno) ... čekej ve frontě
if S = 1 (otevřeno) ... zavři za sebouS <- 0 ... a pokračuj dál
• Signal(S) :S <- 1 (otevři) … vzbuď (první) vlákno,
které čeká ve frontěpřed semaforem S
11/4/2020 vjj 26
Wait
• co znamená "čekej ve frontě" ???
TryToGetThrough: if S = 0. . . . .goto TryToGetThrough
• kdyby to takhle jednoduše dělali i ostatní, nebyla by to (u)spořádaná fronta na semafor S, ale výběr podle nejlepšího postavení v RoundRobinu v okamžiku kdy je semafor S zvednutý (vadilo by to?)
while ( S = 0 ) { }
WaitDWORD WaitForSingleObject
(HANDLE hObject,DWORD milisekundy) ;
• 0 . . . 0xFFFFFFFF = INFINITE
• WAIT_OBJECT_0WAIT_TIMEOUTWAIT_ABANDONEDWAIT_FAILED
DWORD WaitForSingleObjectEx(HANDLE hObject,DWORD milisekundy,BOOL fAlert) ;
11/4/2020 vjj 29
WaitDWORD WaitForMultipleObjects
(DWORD počet,CONST HANDLE * lphObjects,BOOL fWaitAll,DWORD milisekundy) ;
• MAXIMUM_WAIT_OBJECTS• WAIT_OBJECT_0
WAIT_OBJECT_0 . . .. . . WAIT_OBJECT_0 + počet – 1
WAIT_TIMEOUTWAIT_ABANDONED_0WAIT_ABANDONED_0 . . .
. . . WAIT_ABANDONED_0 + počet – 1WAIT_FAILED
11/4/2020 vjj 30
Čekání na "už mám čas"DWORD WaitForInputIdle
(HANDLE hProcess,DWORD milisekundy) ;
PostMessage (hWin2, WM_KEYDOWN, VK_MENU, 0);PostMessage (hWin2, WM_KEYDOWN, VK_F, 0);PostMessage (hWin2, WM_KEYUP, VK_F, 0);PostMessage (hWin2, WM_KEYUP, VK_MENU, 0);PostMessage (hWin2, WM_KEYDOWN, VK_O, 0);PostMessage (hWin2, WM_KEYUP, VK_O, 0);WaitForInputIdle (hProc2, 120000) ;
11/4/2020 vjj 31
Kombinované čekáníDWORD MsgWaitForMultipleObjects
(DWORD počet,LPHANDLE pHandles,BOOL ČekejNaVšechny,DWORD Milisekundy,DWORD ZpůsobČekání);
• Jeden nebo všechny (v závislosti na třetím parametru) objekty signalizují konec
• Specifikovaný typ vstupu se nově objevil ve frontě vlákna
• Uplynul předepsaný interval11/4/2020 vjj 32
Způsob čekání
• QS_ALLINPUTQS_HOTKEYQS_INPUTQS_KEYQS_MOUSEQS_MOUSEBUTTONQS_MOUSEMOVEQS_PAINTQS_POSTMESSAGEQS_SENDMESSAGEQS_TIMER
11/4/2020 vjj 33
SemaforHANDLE hSemafor = CreateSemaphore
(LPSECURITY_ATTRIBUTES lpsa,LONG MaxValue,LPSTR lpszName) ;
HANDLE hSemafor = OpenSemaphore(DWORD Access,BOOL fInherit,LPCTSTR lpszName) ;
BOOL ReleaseSemaphore(HANDLE hSemaphore,LONG Počet,LPLONG PůvodníPočet) ;
11/4/2020 vjj 34
parametr "access"
• 1. parametr funkce OpenSemaphor
• SEMAPHORE_ALL_ACCESS
• úplný přístup
• SEMAPHORE_MODIFY_STATE
• použití v ReleaseSemaphor
• SYNCHRONIZE
• použití v libovolné funkci Wait...
11/4/2020 vjj 35
sdílení semaforu
• 1. proces / vlákno
HANDLE hSemafor ;hSemafor = CreateSemaphore (. . . , "myS") ;
• 2. proces / vlákno
HANDLE hSemafor ;hSemafor = CreateSemaphore (. . . , "myS") ;
if (GetLastError() == ERROR_ALREADY_EXISTS){ // je to sdílený semafor
11/4/2020 vjj 36
MutexHANDLE CreateMutex
(LPSECURITY_ATTRIBUTES lpsa,BOOL InitialOwner,LPSTR lpszMutexName) ;
HANDLE OpenMutex(DWORD fdwAccess,BOOL fInherit,LPCTSTR lpszMutexName) ;
• MUTEX_ALL_ACCESS
• SYNCHRONIZE
BOOL ReleaseMutex (HANDLE mutex) ;
11/4/2020 vjj 37
Mutexusing System . Threading ;static Mutex gM1 ;
gM1 . WaitOne () ;
gM1 . WaitOne (Timeout.Infinite, false) ;
gM1 . ReleaseMutex () ;
11/4/2020 vjj 38
Mutexstatic Mutex gM2 ;static Mutex[] gMs = new Mutex[2] ; gMs[0] = gM1 ;gMs[1] = gM2 ;
Mutex . WaitAll (gMs) ;
Mutex . WaitAny (gMs) ;if (gM1.WaitOne (0, false))
11/4/2020 vjj 39
Synchronizační objekty
• aplikace
• binární semafor
• vícehodnotový semafor
• mutex
• událost, event
• monitor
• system
• semaphor
• spin-lock
11/4/2020 vjj 40
System• semaphor – omezený počet
• spinlock – test-and-set
• fronty čekajících vláken
• během práce Systému se semaforem a s frontami čekajících vláken nemusí být synchronizační data v konzistentním stavu
• nemůže v té době dojít k přerušení, k přepnutí kontextu a k jinému požadavku na změnu v synchronizaci, tj. k požadavku na práci s momentálně nekonzistentními daty?
• IRQL = "hardwarové priority" - režim procesoru
11/4/2020 vjj 41
IRQL ≠ Windows Priority
11/4/2020 vjj 42
už umíme synchronizovat
tak v čem je problém?
11/4/2020 vjj 43
tak v čem je problém?
DEADLOCK
11/4/2020 vjj 44
Dining philosophers
11/4/2020 vjj 55
Dining philosophers problem
• It was originally formulated in 1965 by Edsger WybeDijkstra as a student exam exercise, presented in terms of computers competing for access to tape drive peripherals.
• Soon after, Tony Hoare gave the problem its present formulation.
11/4/2020 vjj 56
Dining philosophers problem
11/4/2020 vjj 57
Plato
Confucius
Socrates
Voltaire
Descartes
philosopher's algorithm
• think until the left fork is available; when it is, pick it up;
• think until the right fork is available; when it is, pick it up;
• when both forks are held, eat for a fixed amount of time;
• then, put the right fork down;
• then, put the left fork down;
• repeat from the beginning
11/4/2020 vjj 58
thinking
get LEFT fork
thinking
get RIGHT fork
dining
release RIGHT forkrelease LEFT fork
Dining philosophers problem
P1
thinking
get LEFT fork
thinking
get RIGHT fork
dining
release RIGHT forkrelease LEFT fork
fork
P2
fork
LEFT
LEFT
RIGHT
RIGHT
Dining philosophers problem
P1
F1
P2
thinking
Wait (F2)
thinking
Wait (F1)
dining
Release (F1)Release (F2)
F2
thinking
Wait (F1)
thinking
Wait (F2)
dining
Release (F1)Release (F2)
start
P1
F1
P2
thinking
Wait (F2)
thinking
Wait (F1)
dining
Release (F1)Release (F2)
F2
thinking
Wait (F1)
thinking
Wait (F2)
dining
Release (F1)Release (F2)
za chvíli
P1
F1
P2
thinking
Wait (F2)
thinking
Wait (F1)
dining
Release (F1)Release (F2)
F2
thinking
Wait (F1)
thinking
Wait (F2)
dining
Release (F1)Release (F2)
a dále
P1
F1
P2
thinking
Wait (F2)
thinking
Wait (F1)
dining
Release (F1)Release (F2)
F2
thinking
Wait (F1)
thinking
Wait (F2)
dining
Release (F1)Release (F2)
a dále
P1
F1
P2
thinking
Wait (F2)
thinking
Wait (F1)
dining
Release (F1)Release (F2)
F2
thinking
Wait (F1)
thinking
Wait (F2)
dining
Release (F1)Release (F2)
a dále
P1
F1
P2
thinking
Wait (F2)
thinking
Wait (F1)
dining
Release (F1)Release (F2)
F2
thinking
Wait (F1)
thinking
Wait (F2)
dining
Release (F1)Release (F2)
a dále
P1
F1
P2
thinking
Wait (F2)
thinking
Wait (F1)
dining
Release (F1)Release (F2)
F2
thinking
Wait (F1)
thinking
Wait (F2)
dining
Release (F1)Release (F2)
a dále
P1
F1
P2
thinking
Wait (F2)
thinking
Wait (F1)
dining
Release (F1)Release (F2)
F2
thinking
Wait (F1)
thinking
Wait (F2)
dining
Release (F1)Release (F2)
a dále
P1
F1
P2
thinking
Wait (F2)
thinking
Wait (F1)
dining
Release (F1)Release (F2)
F2
thinking
Wait (F1)
thinking
Wait (F2)
dining
Release (F1)Release (F2)
a dale? - už nic - deadlock
P1
F1
P2
thinking
Wait (F2)
thinking
Wait (F1)
dining
Release (F1)Release (F2)
F2
thinking
Wait (F1)
thinking
Wait (F2)
dining
Release (F1)Release (F2)
detekce deadlocku
• dynamický orientovaný graf
• kdo na co čeká (červené přerušované)
• co komu patří (obracené zelené)
• vznikne-li cyklus, nastal deadlock
• musíme změnit šipky z "kdo co má" (zelené plné) na "co komu patří" (opačně orientované červené)
11/4/2020 vjj 71
cyklus
P1
F1
P2
thinking
Wait (F2)
thinking
Wait (F1)
dining
Release (F1)Release (F2)
F2
thinking
Wait (F1)
thinking
Wait (F2)
dining
Release (F1)Release (F2)
deadlock
P1
F1
P2
thinking
Wait (F2)
thinking
Wait (F1)
dining
Release (F1)Release (F2)
F2
thinking
Wait (F1)
thinking
Wait (F2)
dining
Release (F1)Release (F2)
podmínky vzniku deadlocku• Coffman conditions (pro binární semafory)
1. mutual exclusion – vzájemná vyloučenost – prostředek má v jeden okamžik vždy nejvýše jednoho (dočasného) uživatele/vlastníka (tj. nikdo jiný ho nesmí používat zároveň)
2. přidělování bez preempce (bez odebírání) – prostředek může uvolnit jen jeho (dočasný) majitel, tj. cyklické čekání nelze násilně ukončit nějakým externím správcem
3. hold and waito prostředky lze žádat postupně/jednotlivě (tj. mohu blokovat jeden prostředek a přitom čekat na jiný) a v libovolném pořadí
4. může dojít k cyklickému čekání11/4/2020 vjj 74
deadlock
• aby mohlo dojít k deadlocku, musí "systém" splňovat všechny Coffmanovy podmínky najednou
• takže k tomu, aby byl "systém" bezpečný (tj. aby nemohlo dojít k deadlocku) stačí, aby v "systému" alespoň jedna z těchto podmínek neplatila
11/4/2020 vjj 75
1. prevence deadlocku
– práce s virtuálními prostředky
– každý si myslí, že má žádaný prostředek sám pro sebe a taky se tak chová (např. tiskárny - Spooling)
– není nutné omezovat přístup k (virtuálním) prostředkům
– není zapotřebí prostředky jejich majitelům odebírat
11/4/2020 vjj 76
virtuální vidličky (???)
P1
thinking
Wait (F1)Wait (F2)
dining
Release (F1)Release (F2)
F1
P2
thinking
Wait (F2)Wait (F1)
dining
Release (F1)Release (F2)
F2
F1
F2
fork
fork
virtuální tiskárny
P1
thinking
Wait (F1)Wait (F2)
dining
Release (F1)Release (F2)
F1
P2
thinking
Wait (F2)Wait (F1)
dining
Release (F1)Release (F2)
F2
F1
F2
spooling for F1
spooling for F2
2. ukončení deadlocku
• preempce
• jeden z procesů v cyklu je zavražděn (proč?)
• prostředky, které vlastnil, jsou opět volné
• násilné odebírání prostředků slouží jenk rozseknutí už vzniklého deadlocku
11/4/2020 vjj 79
preempce
P1
F1
P2
thinking
Wait (F2)
thinking
Wait (F1)
dining
Release (F1)Release (F2)
F2
thinking
Wait (F1)
thinking
Wait (F2)
dining
Release (F1)Release (F2)
preempce
P1
F1
P2
F2
thinking
Wait (F2)
thinking
Wait (F1)
dining
Release (F1)Release (F2)
thinking
Wait (F1)
thinking
Wait (F2)
dining
Release (F1)Release (F2)
3. prevence deadlocku
a) povinnost žádat o všechny používané prostředky najednou
Wait (F1, F2)
dining
Signal (F1)
Signal (F2)
11/4/2020 vjj 82
vše najednou
P1
thinking
Wait (F1, F2)
dining
Release (F2)Release (F1)
F1
P2
thinking
Wait (F1, F2)
dining
Release (F2)Release (F1)
F2
4. prevence deadlocku
b) hierarchie prostředků – pokud proces potřebuje více prostředků najednou, musí o ně žádat v předepsaném pořadí
Wait (F1)Wait (F2)
dining
Signal (F2) Signal (F1)
11/4/2020 vjj 84
předepsané pořadí
P1
thinking
Wait (F1)Wait (F2)
dining
Release (F2)Release (F1)
F1
P2
thinking
Wait (F1)Wait (F2)
dining
Release (F2)Release (F1)
F2
5. prevence deadlockuzabránit vzniku cyklu – Bankéřův algoritmus
Bankéř průběžně financuje investiční projekty svých klientů - bezúročně (!?).
Klienti nemusí požadovat celou potřebnou sumu najednou
Při žádosti o schválení projektu musí ale každý klient předložit celkový plánfinancování.
Ihned po dokončení projektu klient všechny zapůjčené miliardy vrátí.
Nesmí se stát, aby bankéř neměl pro klienta prostředky na dokončení již započatého projektu.
Bankéř může vyplácet jednotlivé části půjčky s libovolně dlouhou prodlevou
11/4/2020 vjj 86
Bankéřův algoritmus1) nový požadavek
2) simulace přidělení požadovaného prostředku
3) zrušení příznaku "skončil" u všech procesů
4) existuje proces, který ještě nemá nastaven příznak "skončil"?
a) ano:existuje proces na jehož dokončení má bankéř momentálně dost prostředků?a. ano: simuluj jeho dokončení, tj. nastav jeho příznak "skončil" a simuluj vrácení
všech jeho prostředků, potom se vrať do bodu 4) .b. ne: odmítni nový požadavek
b) ne: přiděl požadovaný prostředek
11/4/2020 vjj 87
Bankéřův algoritmus
11/4/2020 vjj 88
nový požadavek simulace přidělení prostředku
zrušení příznaku "skončil" u všech procesů
existuje proces, který ještě nemá nastaven příznak "skončil" a který by za dané situace mohl skončit, tj. má
bankéř dost prostředků, aby mohl uspokojit jeho již dříve oznámené požadavky ?
simuluj jeho dokončení, tj. nastav jeho příznak "skončil" a simuluj vrácení
všech jeho prostředků
existuje proces, který ještě nemá nastaven
příznak "skončil"?
přiděl požadovaný prostředek odmítni požadavek
ne ano
ano ne
příklad• bankéř:
celkem 12 mld, 10 půjčeno, 2 zbývají
• přišel požadavek na jednu miliardu s tím, že před jejím vrácením budou požadovány ještě tři další (1+3)
• zápis: x+y = klient si už vypůjčil x miliard, před jejich vrácením bude (postupně) požadovat ještě y dalších
11/4/2020 vjj 89
3+5
1+2
1+1
5+4
2
1+3
3+5
1+2
1+1
5+4
1
1+3
3+5
1+2
1+1
5+4
2
1+3
3+5
1+2
1+1
5+4
9
1+3
3+5
1+2
1+1
5+4
4
1+3
3+5
1+2
1+1
5+4
3
1+3
3+5
1+2
1+1
5+4
12
1+3
bankéř• na začátku, tj. když má bankéř ještě všechno, se jedná
o tzv. bezpečný stav
• bezpečný stav - existuje alespoň jedna posloupnost postupného ukončování projektů (procesů), která skončí tím, že bankéř má zase všechno
• bankéř si vždy ověřuje, vznikne-li splněním nového požadavku opět bezpečný stav, jinak požadavek odmítne
• v předchozím příkladu se předpokládalo, že počáteční stav je bezpečný (taky že byl), a ověřilo se, že splněním požadavku "1+3" vznikne opět bezpečný stav (tím se dodatečně dokázalo, že i ten předchozí byl bezpečný)
11/4/2020 vjj 90
příklad
• ze stejného bezpečného počátečního stavu by splněním požadavku "1+4" vzniknul nebezpečný stav
11/4/2020 vjj 91
3+5
1+2
1+1
5+4
2
1+4
3+5
1+2
1+1
5+4
1
1+4
3+5
1+2
1+1
5+4
2
1+4
3+5
1+2
1+1
5+4
3
1+4
dál to nejde, tj. splněním nového požadavku by
vzniknul nebezpečný stav, požadavek bude odmítnut
kritická sekce
různá pgm řešení
11/4/2020 vjj 92
11/4/2020 vjj 93
P1
thinking
Wait (F1)Wait (F2)
dining
Release (F1)Release (F2)
kritická sekce
podmíněná kritická sekce
region Přístup when Plných<N do
send(X,F)
Plných = Plných + 1
• = semafor + podmínka
11/4/2020 vjj 94
Kritická sekce - přípravaCRITICAL_SECTION myCritSect ;InitializeCriticalSection (&myCritSect) ;
HANDLE hThreads[2] ;hThread[0] = CreateThread ( , myThread, ) ;hThread[1] = CreateThread ( , myThread, ) ;
WaitForMultipleObjects(2, hThreads, TRUE, INFINITE) ;
CloseHandle (hThread[0]) ;CloseHandle (hThread[1]) ;
DeleteCriticalSection (&myCritSect) ;
11/4/2020 vjj 95
kritická sekce - synchronizace
DWORD WINAPI myThread (LPVOID parm){
. . .EnterCriticalSection (&myCritSect) ;
. . . kritická sekce
LeaveCriticalSection (&myCritSect) ;. . .return (0) ;
}
• 2. a 3. vlákno
11/4/2020 vjj 96
monitor• kritické sekce jsou soustředěny do objektu Monitor,
který hlídá jejich exkluzivní volání
monitor Přístup
function Zapiš(X) ...
function Přečti(X) ...
• producent
Přístup.Zapiš(X)
• klient
Přístup.Přečti(X)11/4/2020 vjj 97
.NET Monitor• pro práci se sdílenými daty
static byte[] buffer = new byte[100] ;
static void myFce(){
Monitor.Enter( buffer ) ;. . .Monitor.Exit( buffer ) ;
}
• C#
lock( buffer ) { . . . }
11/4/2020 vjj 98
.NET Monitor
Monitor . Wait (buffer) ;
Monitor . Pulse (buffer) ;
Monitor . PulseAll (buffer) ;
11/4/2020 vjj 99