Programovanie

Moje dva centy za Mutex a Semaphore v C #

Synchronizácia vlákien sa používa na zabránenie viacerým vláknam v súčasnom prístupe k zdieľanému prostriedku. Mutex a Semaphore sú dva z najdôležitejších súvisiacich konceptov. Poďme pochopiť, čo sú to obaja a kedy by sme ich mali používať.

Predtým, ako začneme našu diskusiu, poďme sa rýchlo pozrieť na základné pojmy. Vlákno je najmenšia jednotka vykonania v rámci procesu. Multi-threading v zásade pomáha vykonávať niekoľko úloh súčasne, a tým zvyšuje celkovú priepustnosť aplikácie.

Mutex je synchronizačný primitív, ktorý môže pracovať naprieč procesmi - teda ho možno použiť na medziprocesovú synchronizáciu. Semafor je naopak taký, ktorý umožňuje obmedziť počet vlákien, ktoré majú prístup k zdieľanému prostriedku v rovnakom okamihu. Semafor je v podstate všeobecnejšia forma Mutexu.

Semafor sa používa na obmedzenie počtu vlákien, ktoré môžu mať prístup k zdieľanému prostriedku súčasne. V podstate sa používa na súčasné obmedzenie počtu spotrebiteľov pre konkrétny zdieľaný zdroj. Môžete využiť Semaphore na implementáciu nevýhradného zamykania a tým obmedziť súbežnosť.

Upozorňujeme, že Mutex sa používa na výlučné uzamknutie zdieľaného prostriedku. Inými slovami, Mutex vám umožňuje získať vzájomne sa vylučujúci zámok - jedno vlákno by malo v danom okamihu prístup k zdieľanému prostriedku. Exkluzívne zamykanie sa používa na zabezpečenie toho, že v danom okamihu môže do kritickej sekcie vstúpiť jedno a iba jedno vlákno. Kritická sekcia môže byť definovaná ako dátová štruktúra alebo zdroj, ktorý je zdieľaný viacerými vláknami, ale jedno a iba jedno vlákno k nej môže mať prístup v danom okamihu.

Trieda System.Threading.Mutex predstavuje Mutex a trieda System.Threading.Semaphore sa používa na prácu so Semaphores. Môžete použiť metódu WaitOne na inštancii triedy Mutex na uzamknutie a na uvoľnenie použiť metódu ReleaseMutex.

Mutex mutexObject = nový Mutex (nepravda, „ukážka“);

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

     {

Console.WriteLine ("Momentálne sa ukončuje, pretože sa vykonáva iná inštancia ...");

návrat;

     }

Ak chcete vytvoriť Semafor v C #, mali by ste vytvoriť inštanciu triedy Semafor. Pri vytváraní semaforovej inštancie musíte jej konštruktoru argumentov odovzdať dva argumenty. Zatiaľ čo prvý argument sa používa na označenie počtu počiatočných položiek zdroja, druhý argument sa používa na určenie maximálneho počtu súbežných položiek zdroja. Upozorňujeme, že ak chcete rezervovať všetky sloty pre nové vlákna, ktoré sa majú vytvoriť, mali by ste určiť rovnaké hodnoty pre oba tieto parametre. Nasledujúci úryvok kódu ilustruje, ako môžete vytvoriť semafor v C #.

verejné statické Semaforové vláknoPool = nový Semafor (3, 5);

Prečítajte si útržok kódu uvedený vyššie. Vyššie uvedené vyhlásenie vytvorí semaforový objekt s názvom threadPool, ktorý môže podporovať maximálne 5 súbežných požiadaviek. Všimnite si, že počiatočný počet je nastavený na 3, ako je uvedené v prvom parametri konštruktoru. To znamená, že 2 sloty sú vyhradené pre aktuálne vlákno a 3 sloty sú k dispozícii pre ďalšie vlákna. Poďme teraz napísať nejaký kód!

Nasledujúci úryvok kódu ukazuje, ako môžete vytvoriť a spustiť 10 vlákien pomocou triedy Thread dostupnej v priestore názvov System.Threading. Všimnite si, ako bol použitý delegát ThreadStart.

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

{

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

threadObject.Name = "Názov vlákna:" + i;

threadObject.Start ();

}

Tu je kód metódy PerformSomeWork. Toto je metóda, ktorá v skutočnosti obsahuje kód na prácu so semaformi.

private static void PerformSomeWork ()

       {

threadPool.WaitOne ();

Console.WriteLine ("Vlákno {0} je vnútri kritickej sekcie ...", Thread.CurrentThread.Name);

Závit. Spánok (10 000);

threadPool.Release ();

       }

Prečítajte si vyššie uvedenú metódu PerformSomeWork. Na inštancii Semaphore sa volá metóda WaitOne, ktorá blokuje aktuálne vlákno, kým nie je prijatý signál. Na uvoľnenie semaforu sa na rovnakú inštanciu volá metóda Release. Tu je kompletný zoznam kódov pre vašu referenciu.

trieda SemaphoreDemo

   {

verejné statické Semaforové vláknoPool = nový Semafor (3, 5);

public static void Main (reťazec [] args)

       {

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

           {

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

threadObject.Name = "Názov vlákna:" + i;

threadObject.Start ();

           }

Console.ReadLine ();

       }

private static void PerformSomeWork ()

       {

threadPool.WaitOne ();

Console.WriteLine ("Vlákno {0} je vnútri kritickej sekcie ...", Thread.CurrentThread.Name);

Závit. Spánok (10 000);

threadPool.Release ();

       }

   }

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