1. Prečo zamknúť a čo je zamknuté?
Keď používame vlákna, najefektívnejší spôsob je samozrejme asynchrónny, teda každé vlákno beží súčasne, bez toho, aby sa navzájom spoliehali a čakali. Avšak keď rôzne vlákna potrebujú prístup k určitému zdroju, je potrebný synchronizačný mechanizmus, teda pri čítaní a zápise toho istého zdroja musíme zabezpečiť, aby zdroj operoval len jeden vlákno naraz, aby sme zabezpečili, že každá operácia je efektívna a okamžitá, teda aby sa zabezpečila atomicita jej fungovania. lock je najčastejšie používaná metóda synchronizácie v C#, vo formáte lock(objectA){codeB}.
lock(objectA){codeB} sa zdá jednoduchý, ale v skutočnosti má tri významy, ktoré sú nevyhnutné pre jeho správne použitie: 1. Je objektA zamknutý? Ak nie, zamknem ho, inak počkám, kým sa uvoľní objekt A. 2. Po uzamknutí ostatné vlákna nemôžu volať kódB ani používať objektA počas vykonávania kódu B. 3. Po vykonaní kódu B môžu iné vlákna pristupovať k uvoľneniu objektu A a kódu B.
2. Čo sa stalo so zámkom (týmto)?
Pozrime sa na príklad:
V t1 vlákne LockMe volá lock(this), teda c1 v hlavnej funkcii, a pri volaní lock(c1) v hlavnom vlákne musí počkať, kým sa lockblock v t1 vykoná, aby mohol pristupovať k c1, teda všetky operácie súvisiace s c1 nemôžu byť dokončené, takže vidíme, že aj c1. DoNotLockMe() nie je vykonaný.
|