Szálhoz kapcsolódó fogalmak 1. Szálszinkronizáció ManualResetEvent A Set() metódus az állapotot Signaled-re állítja be Reset() hogy beállítsa jel nélküli állapotra A WaitOne() blokkol, amíg nincs jel, és ha a híváskor van jel, akkor nem blokkol AutoResetEvent A különbség a ManualResetEventtől az, hogy az AutoResetEvent.WaitOne() automatikusan megváltoztatja az eseményobjektum állapotát, vagyis az esemény állapota minden alkalommal változik, amikor az AutoResetEvent.WaitOne() végrehajtása történik. Jel – > nincs jel; Nincs jel – > van jele
example:
myResetEven.Set(), amely valójában egy switch-hez hasonló jellegű, ha a set() metódus nem lesz elindulva, a következő waitOne() nem tud megvárni, hogy az értesítés végrehajtsa, így a waitOne utáni utasítás nem kerül le. Monitor módszer A Wait() Pulse() mechanizmust az interthread interthread interakcióhoz használják, amikor egy objektum kibocsátja a Monitor.Wait() kibocsátást, a szál, amely hozzáfér az objektumhoz, várakozó állapotban marad. Amíg ébresztő jelet nem kap. A monitor.pulse() jelek küldésére szolgál a várakozó szálhoz. Vagyis a kritikus területen a Monitor.Enter() és a Monitor.Exit() között, hogy feloldják az objektum zárolását és blokkolják a jelenlegi szálat, az a sorban várakozó állapotban van.
A zár más, mint a Mutex Zár szinkronizáció több szál között Több szál szinkronizálása Mutex folyamatok között, vagy több folyamat szinkronizálása A .Net többszálas programozásban gyakran használják az AutoResetEvent és a ManualResetEvent osztályokat, amelyek nagyon hasonlóak, de vannak különbségek. A Set metódus a jelet a küldési állapotba helyezi, a Reset metódus a jelet a nem küldő állapotba, a WaitOne pedig várja a jel elküldését. A konstruktor kezdeti állapota meghatározható a paraméterérték alapján, ha igaz, akkor nem blokkol, a hamis pedig a blokkoló állapot. Ha egy szál a WaitOne metódusát hívja, a szál akkor kapja meg a jelet, amikor a küldési állapotban van, és tovább hajt lefelé. A különbség az, hogy a hívás után az AutoResetEvent.WaitOne() egyszerre csak egy szálnak engedélyezi a belépést, és amikor egy szál jelet kap, AutoResetEvent automatikusan a jelet nem küldő állapotba helyezi, és a WaitOne-t hívó többi szál csak folytathatja a várakozást. Vagyis az AutoResetEvent egyszerre csak egy szálat ébreszt fel; A ManualResetEvent több szálat is felidézhet, mert amikor egy szál a ManualResetEvent.Set() metódusát hívja, a többi WaitOne-t hívó szál megkapja a jelet a végrehajtás folytatására, és a ManualResetEvent nem állítja automatikusan be, hogy nem küldi a jelet. Más szóval, hacsak a ManualResetEvent.Reset() metódus nem hívja meg kézzel, a ManualResetEvent továbbra is jelezve marad, és a ManualResetEvent egyszerre több szálat is felidézhet a végrehajtás folytatásához. |