Programmēšana

Mani divi centi par Mutex un Semaforu C #

Vītņu sinhronizācija tiek izmantota, lai neļautu vairākiem pavedieniem vienlaikus piekļūt koplietotam resursam. Mutex un semafors ir divi vissvarīgākie saistītie jēdzieni. Sapratīsim, kas ir šie abi, un kad mums tie būtu jāizmanto.

Pirms sākam diskusiju, ātri apskatīsim pamatjēdzienus. Vītne ir mazākā izpildes vienība procesā. Būtībā multi-threading palīdz jums vienlaikus veikt vairākus uzdevumus un tādējādi palielināt lietojumprogrammas kopējo caurlaidspēju.

Mutex ir sinhronizācijas primitīvs, kas var darboties dažādos procesos - t.i., to var izmantot procesu savstarpējai sinhronizācijai. Semafors gluži pretēji ir tāds, kas ļauj ierobežot to pavedienu skaitu, kuriem tajā pašā laikā ir piekļuve kopīgotam resursam. Būtībā semafors ir vispārīgāks Mutex veids.

Semafors tiek izmantots, lai ierobežotu pavedienu skaitu, kuriem vienlaikus var būt piekļuve koplietotajam resursam. Būtībā to izmanto, lai vienlaikus ierobežotu konkrēta koplietojamā resursa patērētāju skaitu. Jūs varat izmantot Semafora priekšrocības, lai ieviestu neekskluzīvu bloķēšanu un tādējādi ierobežotu vienlaicīgumu.

Ņemiet vērā, ka Mutex tiek izmantots ekskluzīvai bloķēšanai koplietotajā resursā. Citiem vārdiem sakot, Mutex ļauj iegūt savstarpēji izslēdzošu slēdzeni - jebkuram pavedienam noteiktā brīdī būtu piekļuve koplietotam resursam. Ekskluzīva bloķēšana tiek izmantota, lai nodrošinātu, ka jebkurā noteiktā brīdī kritiskajā sadaļā var iekļūt viens un tikai viens pavediens. Kritisko sadaļu var definēt kā datu struktūru vai resursu, kuru koplieto vairāki pavedieni, bet vienam un tikai vienam pavedienam tam var būt piekļuve jebkurā noteiktā brīdī.

Klase System.Threading.Mutex apzīmē Mutex un System.Threading.Semaphore klasi izmanto darbam ar Semaforām. Varat izmantot metodi WaitOne klases Mutex instancē, lai bloķētu, un atbloķēšanai izmantojiet metodi ReleaseMutex.

Mutex mutexObject = jauns Mutex (false, "Demo");

ja (! mutexObject.WaitOne (TimeSpan.FromSeconds (10), false))

     {

Console.WriteLine ("Šobrīd tiek pārtraukta, jo tiek izpildīts cits gadījums ...");

atgriešanās;

     }

Lai izveidotu Semaforu C #, jums jāizveido Semaforu klases eksemplārs. Veidojot semafora instanci, jums jānodod divi argumenti tās argumentu veidotājam. Kamēr pirmais arguments tiek izmantots, lai norādītu sākotnējo resursu ierakstu skaitu, otrais arguments tiek izmantots, lai norādītu maksimālo vienlaicīgo resursu ierakstu skaitu. Ņemiet vērā, ka, ja vēlaties rezervēt visas vietas jaunajiem pavedieniem, kas tiks izveidoti, abiem šiem parametriem jānorāda identiskas vērtības. Šis koda fragments parāda, kā jūs varat izveidot semaforu C #.

publiskais statiskais semafora pavediensPool = jauns semafors (3, 5);

Skatiet iepriekš sniegto koda fragmentu. Iepriekš minētais paziņojums izveido semafora objektu ar nosaukumu threadPool, kas var atbalstīt ne vairāk kā 5 vienlaicīgus pieprasījumus. Ņemiet vērā, ka sākotnējais skaitlis ir iestatīts uz 3, kā norādīts konstruktora pirmajā parametrā. Tas nozīmē, ka 2 sloti ir rezervēti pašreizējam pavedienam un 3 sloti ir pieejami citiem pavedieniem. Tagad uzrakstīsim kodu!

Šis koda fragments parāda, kā jūs varat izveidot un startēt 10 pavedienus, izmantojot sistēmā pieejamo pavedienu klasi. Vītņojot nosaukumvietu. Ievērojiet, kā ir izmantots ThreadStart delegāts.

par (int i = 0; i <10; i ++)

{

Thread threadObject = new Thread (jauns ThreadStart (PerformSomeWork));

threadObject.Name = "Vītnes nosaukums:" + i;

threadObject.Start ();

}

Šeit ir metodes PerformSomeWork kods. Šī ir metode, kas faktiski satur kodu darbam ar semaforām.

privāta statiska anulēšana PerformSomeWork ()

       {

threadPool.WaitOne ();

Console.WriteLine ("pavediens {0} atrodas kritiskajā sadaļā ...", Thread.CurrentThread.Name);

Thread.Sleep (10000);

threadPool.Release ();

       }

Skatiet iepriekš sniegto PerformSomeWork metodi. WaitOne metode tiek aicināta Semafora instancei bloķēt pašreizējo pavedienu, līdz tiek saņemts signāls. Atlaides metode tiek izsaukta tajā pašā instancē, lai atbrīvotu semaforu. Šeit ir pilns kodu saraksts jūsu atsaucei.

klase SemaforaDemo

   {

publiskais statiskais semafora pavediensPool = jauns semafors (3, 5);

public static void Main (string [] args)

       {

par (int i = 0; i <10; i ++)

           {

Thread threadObject = new Thread (jauns ThreadStart (PerformSomeWork));

threadObject.Name = "Vītnes nosaukums:" + i;

threadObject.Start ();

           }

Console.ReadLine ();

       }

privāta statiska anulēšana PerformSomeWork ()

       {

threadPool.WaitOne ();

Console.WriteLine ("Thread {0} atrodas kritiskās sadaļas iekšienē ...", Thread.CurrentThread.Name);

Thread.Sleep (10000);

threadPool.Release ();

       }

   }

$config[zx-auto] not found$config[zx-overlay] not found