Programavimas

Mano du centai „Mutex“ ir „Semafore“ C #

Siūlų sinchronizavimas naudojamas siekiant užkirsti kelią kelioms gijoms vienu metu pasiekti bendrą išteklių. Mutexas ir semaforas yra dvi svarbiausios susijusios sąvokos. Supraskime, kas yra abu šie dalykai, ir kada turėtume juos naudoti.

Prieš pradėdami diskusiją, greitai pažvelkime į pagrindines sąvokas. Gija yra mažiausias proceso vykdymo vienetas. Iš esmės daugialypis siūlas padeda vienu metu atlikti kelias užduotis ir taip padidinti bendrą programos pralaidumą.

„Mutex“ yra sinchronizavimo primityvus, galintis veikti visuose procesuose, t. Y. Jis gali būti naudojamas procesų sinchronizavimui. Priešingai, semaforas leidžia apriboti gijų, turinčių prieigą prie bendro šaltinio, skaičių tuo pačiu metu. Iš esmės semaforas yra labiau apibendrinta „Mutex“ forma.

Semaforas naudojamas norint apriboti gijų, kurios gali vienu metu turėti prieigą prie bendro šaltinio, skaičių. Iš esmės jis naudojamas tam tikram bendram ištekliui vienu metu riboti vartotojų skaičių. Galite pasinaudoti „Semaforo“ pranašumais, kad įgyvendintumėte neišskirtinį užraktą ir taip apribotumėte sutapimą.

Atminkite, kad „Mutex“ naudojamas išskirtiniam bendrojo šaltinio užrakinimui. Kitaip tariant, „Mutex“ suteikia galimybę įsigyti vienas kitą išskiriantį užraktą - bet kuri viena gija tam tikru momentu turėtų prieigą prie bendro šaltinio. Išskirtinis užrakinimas naudojamas siekiant užtikrinti, kad bet kuriuo konkrečiu momentu vienas ir tik vienas siūlas galėtų patekti į kritinę sekciją. Kritinė sekcija gali būti apibrėžiama kaip duomenų struktūra arba išteklius, kuriuos bendrina kelios gijos, tačiau viena ir tik viena gija gali turėti prieigą prie jos bet kuriuo konkrečiu momentu.

„Class.Threading.Mutex“ klasė reiškia „Mutex“ ir „System.Threading.Semafore“ klasė naudojama dirbant su semaforais. Norėdami užrakinti, galite naudoti „WaitOne“ metodą „Mutex“ klasės egzemplioriuje, o atrakinti naudokite „ReleaseMutex“ metodą.

„Mutex“ „mutexObject“ = naujas „Mutex“ (klaidingas, „Demo“);

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

     {

Console.WriteLine ("Šiuo metu baigiama, nes vykdomas kitas egzempliorius ...");

grįžti;

     }

Norėdami sukurti semaforą C #, turėtumėte sukurti semaforų klasės egzempliorių. Kurdami semaforo egzempliorių, turite perduoti du argumentus jo argumentų konstruktoriui. Pirmasis argumentas naudojamas nurodyti pradinių išteklių įrašų skaičių, o antrasis argumentas naudojamas nurodyti maksimalų vienu metu esančių išteklių įrašų skaičių. Atminkite, kad jei norite rezervuoti visus laiko tarpsnius naujoms gijoms, kurios bus sukurtos, turėtumėte nurodyti identiškas abiejų šių parametrų vertes. Šis kodo fragmentas parodo, kaip galite sukurti semaforą C #.

viešoji statinė semaforo gijaPool = naujas semaforas (3, 5);

Žr. Aukščiau pateiktą kodo fragmentą. Ankstesnis sakinys sukuria semaforo objektą, pavadintą threadPool, kuris gali palaikyti ne daugiau kaip 5 vienu metu pateiktas užklausas. Atkreipkite dėmesį, kad pradinis skaičius yra nustatytas kaip 3, kaip nurodyta pirmajame konstruktoriaus parametre. Tai reiškia, kad 2 lizdai yra rezervuoti dabartinei gijai, o 3 - kitiems. Parašykime dabar kodą!

Šis kodo fragmentas parodo, kaip galite sukurti ir paleisti 10 gijų naudodami sistemoje „Siūlų klasė“. Vardų srities gija. Atkreipkite dėmesį, kaip buvo naudojamas „ThreadStart“ delegatas.

už (int i = 0; i <10; i ++)

{

Thread threadObject = nauja gija (nauja ThreadStart (PerformSomeWork));

threadObject.Name = "Gijos pavadinimas:" + i;

threadObject.Start ();

}

Štai „PerformSomeWork“ metodo kodas. Tai metodas, kuriame iš tikrųjų yra darbo su semaforais kodas.

privati ​​statinė tuštuma „PerformSomeWork“ ()

       {

threadPool.WaitOne ();

Console.WriteLine („Temos {0} yra kritinės sekcijos viduje ...“, „Thread.CurrentThread.Name“);

Siūlas. Miegas (10000);

threadPool.Release ();

       }

Žr. Aukščiau pateiktą „PerformSomeWork“ metodą. „WaitOne“ metodas yra vadinamas „Semaforo“ egzemplioriumi, kad blokuotų dabartinę giją, kol bus gautas signalas. Atlaisvinimo metodas yra naudojamas toje pačioje instancijoje, norint išleisti semaforą. Čia yra visas jūsų kodo sąrašas.

klasė SemaforoDemo

   {

viešoji statinė semaforo gijaPool = naujas semaforas (3, 5);

public static void Main (string [] args)

       {

už (int i = 0; i <10; i ++)

           {

Thread threadObject = nauja gija (nauja ThreadStart (PerformSomeWork));

threadObject.Name = "Gijos pavadinimas:" + i;

threadObject.Start ();

           }

Pultas.ReadLine ();

       }

privati ​​statinė tuštuma „PerformSomeWork“ ()

       {

threadPool.WaitOne ();

Console.WriteLine („Gija {0} yra kritinės sekcijos viduje ...“, Thread.CurrentThread.Name);

Siūlas. Miegas (10000);

threadPool.Release ();

       }

   }