Principy Počítačů a operační systémy · podmínky vzniku deadlocku •Coffman conditions...

Post on 30-Sep-2020

1 views 0 download

transcript

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