+ бірнеше процесс арасында ортақ қолдану мүмкіндігі
- lock операторымен салыстырғанда бұғаттау және бұғаттаудан босату уақыты баяу (20 есе шамасында)
семафор
Семафор – .NET Framework ортасына кірістірілген тағы бір синхронизация құралы.
Семафор мьютекске ұқсас, бірақ ол жалпы ресурсқа бір уақытта бір емес, бірнеше ағындардың қатынасуына мүмкіндік береді. Сондықтан семафор бірқатар ресурстарды синхронизациялауға жарамды. Семафор ортақ ресурсқа қатынасуды басқару үшін санауышты пайдаланады. Егер санауыштың мәні нөлден үлкен болса, онда ресурсқа қатынасуға рұқсат етіледі. Ал егер бұл мән нөлге тең болса, онда ресурсқа қол жеткізуге тыйым салынады. Санауыш көмегімен рұқсаттардың саны есептеледі. Демек, ресурстарға қол жеткізу үшін ағын семафордан рұқсат алуы тиіс.
Бір уақытта рұқсат етілген қатынасу саны семафор құрылған кезде көрсетіледі. Егер сіз бір уақытта бір ғана қатынасуға рұқсат беретін семафор құрсаңыз, онда мұндай семафор мьютекс тәрізді әрекет етеді.
семафор
Семафоралар, әсіресе, ортақ ресурс ресурстар тобынан немесе пулынан құрылғанда пайдалы болады. Мысалы, желілік байланыстарды ұсынатын ресурстар пулына қосылуды басқару.
Семафор System.Threading.Semaphore класында жүзеге асырылады, оның бірнеше конструкторы бар. Төменде сол конструкторлардың ең қарапайым формасы берілген:
public Semaphore(int initialCount, int maximumCount)
мұндағы initialCount – семафордың рұқсаттар санауышының бастапқы мәні, maximumCount – санауыштың ең үлкен мәні, яғни семафор бере алатын рұқсаттардың ең үлкен мөлшері.
семафор
Дәл мьютекс жағдайындағыдай, ресурсқа қол жеткізу үшін WaitOne() әдісі қолданылады. Семафорды босату үшін Release() әдісі қолданылады. Бұл әдістің формалары:
public int Release() // бір рұқсатты босату
public int Release(int releaseCount) // бірнеше рұқсатты босату
Әдіс босатуға дейінгі қолжетімді рұқсаттар санын қайтарады.
WaitOne() әдісін бірнеше рет шақырсаңыз, ресурстарды босату үшін Release() әдісін де осынша рет қайталап шақыру керек немесе Release(int releaseCount) әдісінің босататын рұқсаттар санын WaitOne() шақырулар санына тең етіп беру керек.