ПредишенСледващото

Използването на мутекс и семафор

Книгата е предназначена за широк кръг от читатели с интереси в програмирането в C # .Vvedite кратко резюме тук

Книга: C # 4.0: Подробен наръчник

Използването на мутекс и семафор

Раздели на тази страница:

Използването на мутекс и семафор

В повечето случаи, когато искате да синхронизирате, и е доста заключване оператор. Въпреки това, в някои случаи, като например чрез ограничаване на достъпа до споделени ресурси, са по-удобни механизми за синхронизиране, вградени в рамката за .NET. Ние се обсъжда по-долу, за две такива механизми: мутекс и семафор.

Mutex е взаимно изключващи се часовник обект. Това означава, че тя може да бъде получена само от опашката на потока. Mutex е предназначена за тези ситуации, когато споделения ресурс могат да бъдат използвани едновременно в един поток. Да приемем, че лог файл се споделя от няколко процеса, но само един от тези данни могат да бъдат записани в този файл по всяко време. За да синхронизирате процесите в тази ситуация е идеална мутекс.

Mutex се поддържа System.Threading.Mutex клас. Той има няколко конструктора. По-долу са двата най-разпространени дизайнера.

обществен Mutex ()
обществен Mutex (булев initiallyOwned)

В първата форма на строителя създава мутекс, която първоначално никой не притежава. Втората форма на начално състояние мутекс обажда конец хване когато INI параметър tiallyOwned има Булева стойност истина. В противен случай, никой не е собственик на мутекс.

За да получите най-мутекс, в програмния код трябва да се извика методът WaitOne () за тази мутекс. WaitOne () метод наследени от клас Mutex Thread.WaitHandle клас. По-долу най-простата си форма.

WaitOne () метод чака до тогава, докато не мутекс, за които той е бил призован. Ето защо този метод забранява изпълнението на нишката призвание, докато, докато тя стане достъпна каза мутекс. Той винаги се връща булева стойност истина.

Когато кодът вече не е длъжен да държи мутекс, тя се освобождава, като се обадите ReleaseMutex (). който е показан по-долу под формата.

обществени невалидни ReleaseMutex ()

В тази форма ReleaseMutex () метод освобождава мутекс, за което е бил призован, което позволява на друга тема, за да получите мутекс.

За използване с целта на MUTEX за синхронизиране на достъп до споделен ресурс споменато по-горе WaitOne () и ReleaseMutex () се използват, както е показано в следната кодовия фрагмент.

Mutex myMtx = нов Mutex ();
//.
myMtx.WaitOne (); // чака мутекс
// Получаване на достъп до дела.
myMtx.ReleaseMutex (); // освободи MUTEX

Когато се обаждате WaitOne () изпълнение на съответен поток се спира до момента, докато не мутекс. Метод повикване ReleaseMutex () мутекс се освобождава и след това може да бъде получена от друга нишка. С този подход към синхронизирането на едновременен достъп до общ ресурс е ограничен до само една нишка.

Механизмът програма синхронизация Следният пример е описано по-горе е показано на практика. В тази програма са два потока под формата на класове и IncThread DecThread. че изисква достъп до общ ресурс: променлива SharedRes.Count. Потокът IncThread SharedRes.Count променлива се увеличава, и DecThread на потока - декрементирани. За да се избегне едновременен достъп на двата потока към споделен ресурс SharedRes.Count този достъп е синхронизиран мутекс и MTX. също е член на SharedRes клас.

Тази програма дава следния резултат.

Увеличава нишката чака мутекс.
Увеличава нишката получава мутекс.
Намалява нишката чака мутекс.
поток на потока се увеличава, SharedRes.Count = 1
поток на потока се увеличава, SharedRes.Count = 2
поток на потока се увеличава, SharedRes.Count = 3
поток на потока се увеличава, SharedRes.Count = 4
поток на потока се увеличава, SharedRes.Count = 5
Нахранете нарастват освобождава мутекс.
Намалява нишката получава мутекс.
поток на потока се намалява стъпалообразно, SharedRes.Count = 4
поток на потока се намалява стъпалообразно, SharedRes.Count = 3
поток на потока се намалява стъпалообразно, SharedRes.Count = 2
поток на потока се намалява стъпалообразно, SharedRes.Count = 1
поток на потока се намалява стъпалообразно, SharedRes.Count = 0
Декрементирани поток освобождава мутекс.

Както следва от по-горе резултат, достъп до споделен ресурс (променлива SharedRes.Count) е синхронизирано и следователно стойността на тази променлива може да бъде едновременно променя само в един поток.

Увеличава нишката чака мутекс.
Увеличава нишката получава мутекс.
Намалява нишката чака мутекс.
Намалява нишката получава мутекс.
поток на потока се увеличава, SharedRes.Count = 1
поток на потока се намалява стъпалообразно, SharedRes.Count = 0
поток на потока се увеличава, SharedRes.Count = 1
поток на потока се намалява стъпалообразно, SharedRes.Count = 0
поток на потока се увеличава, SharedRes.Count = 1
поток на потока се намалява стъпалообразно, SharedRes.Count = 0
поток на потока се увеличава, SharedRes.Count = 1
поток на потока се намалява стъпалообразно, SharedRes.Count = 0
поток на потока се увеличава, SharedRes.Count = 1
Нахранете нарастват освобождава мутекс.
поток на потока се намалява стъпалообразно, SharedRes.Count = 0
Декрементирани поток освобождава мутекс.

Както следва от по-горе резултат, без мутекс увеличаване и намаляващи SharedRes.Count променлива се появява повече от случайно в серия.

Mutex създаден в предишния пример, е известен само на процеса, че генерира. Но вие можете да създадете мутекс и така, че той е известен никъде другаде. За да направите това, тя трябва да бъде назован. Под форма дизайн за създаването на този мутекс.

обществен Mutex (булев initiallyOwned, име низ)
обществен Mutex (булев initiallyOwned, низ с името на, от булев createdNew)

И в двете форми, името на дизайнера означава конкретното име на мутекс. Докато в първата форма на параметъра конструктор INI tiallyOwned има логическа стойност на вярно. собствеността на мутекс се иска. Но тъй като мутекс е собственост на друг процес на системно ниво, този вариант е по-добре да се уточни фалшивото Булева стойност. След завръщането на втората форма на строителя параметър createdNew ще има стойност логика вярно. ако е било поискано владение на мутекс и получени и фалшива Булева стойност. ако беше отказано искането за собственост. Има и трета форма на тип Mutex конструктор. , където можете да определите типа на контрол обект MutexSecurity за достъп. Използване наречени mutexes да синхронизира процеси взаимодействия.

Един последен въпрос: в потока, придобиване на мутекс се позволява да прави метод един или повече допълнителни разговори WaitOne () преди да се обадите ReleaseMutex (). всички тези допълнителни разговори ще бъде успешно. Това означава, че допълнителен метод призовава WaitOne () няма да блокира потока, който вече е собственик на мутекс. Но броят на WaitOne метод Call () трябва да бъде равна на броя на обажданията ReleaseMutex (метод), за да освободите мутекс.

Semaphore мутекс е подобна, с изключение на това, че осигурява едновременен достъп до споделения ресурс е не една, а няколко теми. Ето защо, семафор е подходящ за синхронизиране на редица ресурси. Semaphore контролира достъпа до споделен ресурс, като се използва брояч за тази цел. Ако стойността на брояч е по-голяма от нула, се разрешава след това достъп до ресурса. Ако тази стойност е равна на нула, а след това достъп до ресурса е забранено. С тезгяха се броят брой разрешителни. Следователно, за да получите достъп до потока на ресурсите трябва да получи разрешение от семафора.

Обикновено поток, който изисква достъп до общ ресурс, се опитва да получи разрешение от семафора. Ако стойността на брояча семафор е по-голяма от нула, а след това потокът е разрешено, и семафор брояча се намалява стойността си. В противен случай, нишката е блокиран до момента, докато не се разрешение. Когато потокът вече не се изисква за достъп до споделен ресурс, той освобождава резолюцията и семафор брояча се увеличава. Ако друг конец чака разрешение, той го получава в този момент. Броят на едновременно разрешение за достъп до посочили при създаването семафора. Например, ако създадете семафор в същото време позволява само един достъп, а след това ще действа като семафор мутекс.

Семафори са особено полезни в случаите, когато делът е съставен от група или ресурс басейн. Например, басейна на ресурсите може да се състои от няколко мрежови връзки, всяка от които се използват за предаване на данни. Ето защо, на потока, който изисква връзка с мрежата, така или иначе, това, което и да е връзка, която получава. В този случай, семафор предоставя удобен механизъм за управление на достъпа до мрежовите връзки.

Semaphore се реализира в System.Threading.Semaphore клас. който има няколко конструктора. По-долу е най-простата форма на конструктора на класа:

обществен Semaphore (инт initialCount, вътр maximumCount)

където initialCount - е първоначалната стойност на семафор брояч разрешения, т.е. размер първоначално наличните резолюции; maximumCount - максималната стойност на брояча, т.е. максималния брой разрешителни, които могат да дадат семафор.

А семафор се използва по същия начин, както е описано преди мутекс. За да получите достъп до ресурс в програмния код се нарича WaitOne (метод на семафор). Този метод е наследен от WaitHandle клас Semaphore клас. WaitOne () метод изчаква докато семафор, за които тя се нарича. По този начин, на блокове изпълнение на нишка разговори до семафор все още не е дал разрешение да се предостави достъп до ресурса.

Свързани статии

Подкрепете проекта - споделете линка, благодаря!