HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Mutex osztály használata


Példaprogram letöltése

8168 bájt

Amennyiben többszálú alkalmazásainkban a szálak menedzselését valamilyen okból nem kívánjuk a beépített pooling-ra bízni, hanem inkább magunk szeretnénk azok működését kézben tartani, akkor meg kell találnunk a .NET szinkronizációs osztályait. Egyik ilyen osztály a Mutex, mellyel a különböző erőforrások megoszthatók az egyes szálak között. Cikkünkben bemutatjuk egy példán keresztül, hogy a szálak viselkedése és futása hogyan befolyásolható az osztály segítségével.

Mutex objektumok szerepe
A Mutex osztály példányai olyan szinkronizációs primitívek, melyek segítségével az alkalmazás szálai vagy a számítógép process-ei egymás futásának akadályozása nélkül képesek osztozni a rendszer erőforrásain. Így biztosítható, hogy az adott erőforrást egy időben csak egy szál, illetve process használja.
A Mutex objektum úgy működik, hogy egy szál lefoglal egy Mutex objektumot az adott erőforrás használatának idejére, majd a használat befejezésekor felszabadítja a Mutex objektumot. Ha az adott Mutex-et egy másik szál is lefoglalta (birtokolja), akkor a szál működése addig marad felfüggesztve, amíg a korábban lefoglaló szál el nem végzi a felszabadítást, jelezve, hogy már nem használja az erőforrást.
Több változata lehetséges a Mutex objektum(ok) használatának, melyek közül a Mutex osztály metódusainak meghívásával lehet választani.
Amennyiben az adott szálművelet elvégzésekor a birtokolt Mutex objektum WaitOne metódusát hívjuk meg, akkor jelezzük a szálobjektum számára, hogy a futásának feltétele, hogy az adott Mutex objektum a ReleaseMutex metódus meghívásával felszabadításra kerüljön.
Ugyanakkor arra is van lehetőségünk, hogy egy adott Mutex csoportot vegyen birtokba egy adott szál, melyeket egy tömbben tárolhatunk. Ekkor előírhatjuk, hogy az adott szál futásának feltétele a Mutex-ek egyikének, vagy mindegyikének felszabadítása. Amennyiben egy Mutex felszabadítása is elegendő a szál futásának folytatásához, akkor a Mutex.WaitAny statikus metódus meghívására van szükség, ha pedig minden Mutex-et fel kell szabadítani futás előtt, akkor a Mutex.WaitAll metódus meghívására.
Abban az esetben, ha egy szál normális körülmények között terminál, az általa birtokolt Mutex jelző (signaled) állapotban marad, és a következő várakozó szál birtokába kerül. Ha éppen nincs várakozó szál, akkor a Mutex szintén ebben az állapotban marad.
Gyakorlati felhasználás
A Mutex objektumokat leggyakrabban név nélkül hozzuk létre, a konstruktor azon változatát felhasználva, melyben egy logikai érték beállításával jelezzük a szál tulajdonlási igényét. Példánkban ez az érték TRUE, vagyis a hívó szál tulajdonosa is a Mutex-nek.
private Mutex mutex1 = new Mutex(true);
private Mutex mutex2 = new Mutex(true);
private Mutex mutex3 = new Mutex(true);
Példánkban három szállal dolgozunk, melyek mindegyike ugyanazt a feladatot kapja, nevezetesen azt, hogy a ProgressBar kontrol indikátorát mozgassa a megfelelő értékre egy kis késleltetéssel. Így imitálva egy időigényes műveletet.
Az első szál a mutex1 és a mutex2 objektumokat egy tömbbe gyűjti, és a futást csak akkor folytatja a létrehozás után, ha a Mutex-ek mindegyike felszabadul. A második szál ezek közül csak az egyik felszabadulására vár, míg a harmadik szál a harmadik felszabadulása után futhat. A felszabadításokat a Form három nyomógombjával tehetjük meg, közben megfigyelhetjük, hogy éppen melyik szál kezdi meg a futást.
A szálak inicializálása a hagyományos módszerrel történik. A Start gombra kattintva létrehozzuk a három Thread objektumot.
Thread th1 = new Thread(new ThreadStart(DoStart1));
Thread th2 = new Thread(new ThreadStart(DoStart2));
Thread th3  = new Thread(new ThreadStart(DoStart3));
Meghívjuk Start metódusaikat.
th1.Start();
th2.Start();
th3.Start();
A szálak indulásakor végrehajtjuk a megfelelő metódusokat (DoStart1, ...). Az első szál esetében elvégezzük a tömbbe sorolást, majd meghívjuk a WaitAll metódust, jelezve, hogy a Mutex-ek mindegyikének fel kell szabadulnia ahhoz, hogy a szál futhasson.
Mutex[] mutexList1 = new Mutex[2];
mutexList1[0] = mutex1;
mutexList1[1] = mutex2;
Mutex.WaitAll(mutexList1);
A második esetben már elegendő egy Mutex-et felszabadítanunk.
...
Mutex.WaitAny(mutexList2);
A harmadik szál pedig csak a mutex1 objektumtól függ.
mutex3.WaitOne();
A gombok valamelyikének lenyomásával felszabadíthatjuk a megfelelő Mutex-et, elérve, hogy valamely szál folytassa működését.
mutex1.ReleaseMutex();
...

Cikksorozat

#IDKategóriaCikk címeSorozat
2591WindowsTippek és trükkök - RAS - Modem csengetési szám állítása1. rész
2622WindowsTippek és trükkök - Program futtatása más felhasználóként2. rész
2640WindowsA Windows ikonméretének megváltoztatása és Windows 2000 Asztaltémák3. rész
2657WindowsTippek és trükkök - Internet Explorer4. rész
2667WindowsTippek és trükkök5. rész
2684WindowsAlapértelmezések állítása, telepítési fájlok helye, intéző nézetek6. rész
2696WindowsBiztonsági trükkök7. rész
2702WindowsWindows XP trükkök8. rész
2729WindowsWindows 2000 és XP tippek, trükkök9. rész
2757WindowsRegistry trükkök10. rész
2784WindowsTippek, trükkök11. rész
2829WindowsTippek, trükkök12. rész
2889WindowsWindows XP tippek13. rész
2909WindowsTippek Windows XP-hez14. rész
2919WindowsWindows tippek15. rész
2924WindowsWindows tippek16. rész
2963WindowsWindows tippek17. rész
2973WindowsWindows Tippek18. rész
2981WindowsWindows tippek19. rész
2990WindowsTippek-trükkök20. rész
3027WindowsIIS tippek21. rész
3034WindowsWindows XP tippek-trükkök22. rész
3088WindowsWindows 2000/XP tippek, trükkök23. rész
3133WindowsWindows XP tippcsokor24. rész
3140WindowsWindows XP tippek, trükkök25. rész
3152WindowsXP és IIS tippek - trükkök26. rész
3158WindowsWindows XP tippek, trükkök27. rész
3168WindowsTippek, trükkök28. rész
3170WindowsRegistry trükkök29. rész
3179WindowsTippek, trükkök30. rész
3197WindowsWindows XP tippek, trükkök31. rész
3205WindowsTippek, trükkök32. rész
3214WindowsTippek, trükkök33. rész
3223WindowsTippek, trükkök34. rész
3233WindowsTippek, trükkök35. rész
3271WindowsTippek, trükkök36. rész
3307WindowsTippek, trükkök37. rész
3370WindowsTippek, trükkök38. rész
3399WindowsTippek, trükkök39. rész
3510WindowsTippek, trükkök40. rész
3611WindowsHardverrel kapcsolatos tippek, trükkök41. rész
3668WindowsRegistry trükkök42. rész
3711WindowsTippek, trükkök43. rész
3771WindowsTippek, trükkök44. rész
3801WindowsTippek, trükkök45. rész
3831WindowsTippek, trükkök46. rész
3891WindowsTippek, trükkök47. rész
3921WindowsTippek, trükkök48. rész
3981WindowsTippek, trükkök49. rész
4041WindowsTippek, trükkök50. rész
4071WindowsTippek, trükkök51. rész
4151WindowsTippek, trükkök52. rész
4171C#Tippek, trükkök53. rész
4211WindowsTippek, trükkök54. rész
4251WindowsTippek, trükkök55. rész
4281WindowsTippek, trükkök56. rész
3589DelphiTippek, trükkök57. rész
3718DelphiTippek, trükkök58. rész


Könyv
Ez a cikk megtalálható ebben a könyvben: C# Software Offline 2003 évkönyv 496. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |