Programmering

Mine to øre på Mutex og Semaphore i C #

Trådesynkronisering brukes til å forhindre at flere tråder får tilgang til en delt ressurs samtidig. Mutex og Semaphore er to av de viktigste relaterte begrepene. La oss forstå hva begge disse er, og når skal vi bruke dem.

La oss ta en rask titt på de grunnleggende konseptene før vi begynner. En tråd er den minste utførelsesenheten i en prosess. I hovedsak hjelper multi-threading deg med å utføre flere oppgaver samtidig og dermed øke applikasjonens totale gjennomstrømning.

En Mutex er en synkroniseringsprimitiv som kan arbeide på tvers av prosesser - dvs. den kan brukes til synkronisering mellom prosesser. Tvert imot er en semafor en som lar deg begrense antall tråder som har tilgang til en delt ressurs på samme tidspunkt. I det vesentlige er en semafor en mer generalisert form av en Mutex.

En semafor brukes til å begrense antall tråder som kan ha tilgang til en delt ressurs samtidig. I hovedsak brukes den til å begrense antall forbrukere for en bestemt delt ressurs samtidig. Du kan dra nytte av Semaphore for å implementere ikke-eksklusiv låsing og dermed begrense samtidighet.

Merk at en Mutex brukes til eksklusiv låsing på en delt ressurs. Med andre ord, en Mutex lar deg anskaffe en gjensidig lås - en hvilken som helst tråd vil ha tilgang til en delt ressurs på et gitt tidspunkt. Eksklusiv låsing brukes til å sikre at en og bare en tråd på et gitt tidspunkt kan komme inn i en kritisk seksjon. En kritisk seksjon kan defineres som en datastruktur eller en ressurs som deles av flere tråder, men en og samme tråd kan ha tilgang til den på et gitt tidspunkt.

System.Threading.Mutex-klassen representerer en Mutex og System.Threading.Semaphore-klassen brukes til å jobbe med Semaphores. Du kan bruke WaitOne-metoden i en forekomst av Mutex-klassen for å låse og bruke ReleaseMutex-metoden for å låse opp.

Mutex mutexObject = ny Mutex (falsk, "Demo");

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

     {

Console.WriteLine ("Avslutter for øyeblikket som en annen forekomst er i utførelse ...");

komme tilbake;

     }

For å opprette en semafor i C #, bør du opprette en forekomst av Semaphore-klassen. Når du oppretter en Semaphore-forekomst, må du sende to argumenter til argumentkonstruktøren. Mens det første argumentet brukes til å indikere antall innledende ressursoppføringer, brukes det andre argumentet til å spesifisere maksimalt antall samtidige ressursoppføringer. Merk at hvis du vil reservere alle spor for de nye trådene som skal opprettes, bør du spesifisere identiske verdier for begge disse parametrene. Følgende kodebit illustrerer hvordan du kan lage en semafor i C #.

offentlig statisk Semaphore threadPool = ny Semaphore (3, 5);

Se kodebiten gitt ovenfor. Ovennevnte uttalelse oppretter et semaforobjekt med navnet threadPool som kan støtte maksimalt 5 samtidige forespørsler. Merk at den innledende tellingen er satt til 3 som angitt i den første parameteren til konstruktøren. Dette innebærer at to spor er reservert for gjeldende tråd og 3 spor er tilgjengelige for andre tråder. La oss nå skrive litt kode!

Følgende kodebit viser hvordan du kan opprette og starte 10 tråder ved hjelp av trådklassen som er tilgjengelig i systemet. Legg merke til hvordan ThreadStart-delegaten har blitt brukt.

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

{

Tråd trådObject = ny tråd (ny trådStart (PerformSomeWork));

threadObject.Name = "Trådnavn:" + i;

threadObject.Start ();

}

Her er koden til PerformSomeWork-metoden. Dette er metoden som faktisk inneholder koden for å jobbe med semaforer.

privat statisk tomrom PerformSomeWork ()

       {

threadPool.WaitOne ();

Console.WriteLine ("Tråden {0} er inne i den kritiske delen ...", Thread.CurrentThread.Name);

Tråd. Søvn (10000);

threadPool.Release ();

       }

Se PerformSomeWork-metoden gitt ovenfor. WaitOne-metoden kalles på Semaphore-forekomsten for å blokkere den gjeldende tråden til et signal mottas. Utgivelsesmetoden kalles i samme tilfelle for å frigjøre semaforen. Her er den komplette kodelisten for din referanse.

klasse SemaphoreDemo

   {

offentlig statisk Semaphore threadPool = ny Semaphore (3, 5);

public static void Main (streng [] args)

       {

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

           {

Tråd trådObject = ny tråd (ny trådStart (PerformSomeWork));

threadObject.Name = "Trådnavn:" + i;

threadObject.Start ();

           }

Console.ReadLine ();

       }

privat statisk tomrom PerformSomeWork ()

       {

threadPool.WaitOne ();

Console.WriteLine ("Tråden {0} er inne i den kritiske delen ...", Thread.CurrentThread.Name);

Tråd. Søvn (10000);

threadPool.Release ();

       }

   }

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