Net, мутекс и класове семафор

Клас Mutex (взаимно изключване - взаимно изключване или мутекс) е един от класовете, в Рамката на .NET, което позволява да се осигури синхронизация измежду множеството процеси. Той е много подобен на класа за монитор, който също така позволява наличието на само един собственик. Само една нишка може да придобие ключалката и достъпа до защитени територии на мутекс синхронизиран код.

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

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

В Mutex има няколко конструктора. По-долу са две от най-често срещаните дизайнер:

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

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

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

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

Net, мутекс и класове семафор

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

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

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

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

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

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

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

Ако кодът вече не е необходимо да притежавате семафор, той се освобождава, като се обадите метод Release (). По-долу са две форми на този метод:

В първата форма на излизане () метод за пресата само едно разрешително, а втората форма - броят на разрешения за определени параметри releaseCount. И в двете форми, този метод се връща номера на броя на разрешителните, които са съществували преди освобождаването.

В .NET 4 предлага два класа с функционалността на семафор: Semaphore и SemaphoreSlim. Semaphore клас може да бъде назован, използване на ресурсите в рамките на системата и да се осигури синхрон между различните процеси. Клас SemaphoreSlim Semaphore е олекотена версия на класа, който е оптимизиран за да се осигури най-кратко време за изчакване.