Mutex, semafor, secțiuni critice

Sincronizarea obiectelor: mutex, semafor, secțiuni critice

Secțiunile critice oferă sincronizare ca mutexurile (vezi mutexurile de mai jos), cu excepția faptului că obiectele care reprezintă secțiuni critice sunt disponibile în același proces. Evenimentele, mutexurile și semaphorele pot fi de asemenea utilizate într-o aplicație "cu un singur proces", dar secțiunile critice oferă un mecanism mai rapid și mai eficient pentru sincronizarea reciprocă. Ca mutexuri, un obiect care reprezintă o secțiune critică poate fi utilizat numai de un fir la un moment dat, ceea ce le face extrem de utile atunci când descrie accesul la resursele partajate. Este greu să ne imaginăm nimic despre ordinea în care firele vor avea acces la resursă, puteți spune că sistemul va fi "corect" pentru toate firele.







Mutex (mutex) este un obiect de sincronizare care este setat la o anumită stare de semnalizare atunci când nu este ocupat de niciun fir. Numai un fir deține acest obiect în orice moment, de unde și numele unor astfel de obiecte - este exclusă accesul simultan la resursa comună. De exemplu, pentru a preveni ca două fire să fie scrise într-o locație de memorie comună în același timp, fiecare thread se așteaptă ca mutexul să devină liber, devine proprietarul acestuia și numai atunci scrie ceva în această locație de memorie. După toate acțiunile necesare, mutex-ul este lansat, oferind accesul altor fire la resursele partajate.







Două (sau mai multe) procese pot crea un mutex cu același nume apelând metoda CreateMutex. Primul proces creează de fapt un mutex, iar următoarele procese obțin mânerul unui obiect deja existent. Acest lucru permite mai multor procese să primească mânerul aceluiași mutex, eliberând programatorul de a avea grijă de cine creează efectiv mutexul. Dacă se folosește această abordare, este de dorit să setați flagul bInitialOwner la FALSE, altfel vor exista unele dificultăți în determinarea creatorului actual de mutex.

Mai multe procese pot primi mânerul aceluiași mutex, ceea ce face posibilă interacțiunea dintre procese. Puteți utiliza următoarele mecanisme ale acestei abordări:

Procesul de copil creat cu funcția CreateProcess poate moșteni mânerul unui mutex în cazul în care, atunci când (mutex) crearea parametrului Funk CreateMutex a fost lpMutexAttributes specificate.

Un proces poate obține un duplicat al unui mutex existent utilizând funcția DuplicateHandle.

Procesul poate specifica numele unui mutex existent atunci când apelează funcțiile OpenMutex sau CreateMutex.

În general, dacă sincronizați fluxurile unui proces, abordarea mai eficientă este utilizarea secțiunilor critice.







Articole similare

Trimiteți-le prietenilor: