Programmering

Mine to cent på Mutex og Semaphore i C #

Trådsynkronisering bruges til at forhindre flere tråde i at få adgang til en delt ressource samtidigt. Mutex og Semaphore er to af de vigtigste relaterede begreber. Lad os forstå, hvad begge disse er, og hvornår skal vi bruge dem.

Før vi begynder vores diskussion, lad os tage et hurtigt kig på de grundlæggende begreber. En tråd er den mindste eksekveringsenhed inden for en proces. I det væsentlige hjælper multi-threading dig med at udføre flere opgaver samtidigt og dermed øge programmets samlede kapacitet.

En Mutex er en primitiv synkronisering, der kan arbejde på tværs af processer - dvs. den kan bruges til synkronisering mellem processer. Tværtimod er en semafor en, der giver dig mulighed for at begrænse antallet af tråde, der har adgang til en delt ressource på samme tidspunkt. I det væsentlige er en semafor en mere generaliseret form for en Mutex.

En semafor bruges til at begrænse antallet af tråde, der kan have adgang til en delt ressource samtidigt. I det væsentlige bruges det samtidig til at begrænse antallet af forbrugere til en bestemt delt ressource. Du kan drage fordel af Semaphore til at implementere ikke-eksklusiv låsning og dermed begrænse samtidighed.

Bemærk, at en Mutex bruges til eksklusiv låsning på en delt ressource. Med andre ord giver en Mutex dig mulighed for at erhverve en gensidigt eksklusiv lås - en hvilken som helst tråd ville have adgang til en delt ressource på et givet tidspunkt. Eksklusiv låsning bruges til at sikre, at en og kun en tråd på et givet tidspunkt kan komme ind i et kritisk afsnit. Et kritisk afsnit kan defineres som en datastruktur eller en ressource, der deles af flere tråde, men en og samme tråd kan have adgang til den på et givet tidspunkt.

System.Threading.Mutex-klassen repræsenterer en Mutex og System.Threading.Semaphore-klassen bruges til at arbejde med Semaphores. Du kan bruge WaitOne-metoden i en forekomst af Mutex-klassen til at låse og bruge ReleaseMutex-metoden til at låse op.

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

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

     {

Console.WriteLine ("Afslutning for nu som en anden forekomst er i udførelse ...");

Vend tilbage;

     }

For at oprette en semafor i C # skal du oprette en forekomst af Semaphore-klassen. Når du opretter en Semaphore-forekomst, skal du videregive to argumenter til dens argumentkonstruktør. Mens det første argument bruges til at angive antallet af indledende ressourceposter, bruges det andet argument til at specificere det maksimale antal samtidige ressourceposter. Bemærk, at hvis du vil reservere alle slots til de nye tråde, der oprettes, skal du angive identiske værdier for begge disse parametre. Følgende kodestykke illustrerer, hvordan du kan oprette en semafor i C #.

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

Se kodeuddraget ovenfor. Ovenstående udsagn opretter et semaforobjekt med navnet threadPool, der maksimalt kan understøtte 5 samtidige anmodninger. Bemærk, at den oprindelige optælling er indstillet til 3 som angivet i den første parameter til konstruktøren. Dette indebærer, at 2 slots er reserveret til den aktuelle tråd, og 3 slots er tilgængelige for andre tråde. Lad os nu skrive noget kode!

Følgende kodestykke viser, hvordan du kan oprette og starte 10 tråde ved hjælp af den trådklasse, der er tilgængelig i systemet. Bemærk, hvordan ThreadStart-delegaten er blevet brugt.

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

{

Tråd threadObject = ny tråd (ny ThreadStart (PerformSomeWork));

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

threadObject.Start ();

}

Her er koden til PerformSomeWork-metoden. Dette er metoden, der faktisk indeholder koden til at arbejde med semaforer.

privat statisk ugyldighed PerformSomeWork ()

       {

threadPool.WaitOne ();

Console.WriteLine ("Tråd {0} er inde i det kritiske afsnit ...", Thread.CurrentThread.Name);

Tråd.Sove (10000);

threadPool.Release ();

       }

Se metoden PerformSomeWork, der er angivet ovenfor. WaitOne-metoden kaldes på Semaphore-forekomsten til at blokere den aktuelle tråd, indtil et signal modtages. Release-metoden kaldes i samme instans for at frigive semaforen. Her er den komplette kodeliste til din reference.

klasse SemaphoreDemo

   {

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

offentlig statisk tomrum Main (streng [] args)

       {

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

           {

Tråd threadObject = ny tråd (ny ThreadStart (PerformSomeWork));

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

threadObject.Start ();

           }

Console.ReadLine ();

       }

privat statisk ugyldighed PerformSomeWork ()

       {

threadPool.WaitOne ();

Console.WriteLine ("Tråd {0} er inde i det kritiske afsnit ...", Thread.CurrentThread.Name);

Tråd.Sove (10000);

threadPool.Release ();

       }

   }