1. Proč zamykat a co je zamčené?
Když používáme vlákna, nejefektivnější je samozřejmě asynchronní, tedy každé vlákno běží současně, aniž by se na sebe spoléhalo a čekalo. Když však různá vlákna potřebují přístup k určitému zdroji, je potřeba synchronizační mechanismus, tedy při čtení a zápisu stejného zdroje je potřeba, aby zdroj operoval pouze jeden vlákno současně, aby byla každá operace efektivní a okamžitá, tedy aby byla zajištěna atomovost jejího provozu. lock je nejčastěji používaná metoda synchronizace v C#, ve formátu lock(objectA){codeB}.
lock(objectA){codeB} se zdá jednoduchý, ale ve skutečnosti má tři významy, což je zásadní pro správné použití: 1. Je objektA zamčen? Pokud ne, zamknu ho, jinak počkám, až bude objekt A uvolněn. 2. Po uzamčení nemohou ostatní vlákna volat kód B ani používat objektA během provádění kódu B. 3. Po spuštění kódu B mohou být uvolněné objekty A a kódy B přístupné jinými vlákny.
2. Co se stalo s zámkem (tímto)?
Podívejme se na příklad:
V vlákně t1 LockMe volá lock(this), tedy c1 v hlavní funkci, a při volání lock(c1) v hlavním vlákně musí počkat, až bude lock block v t1 vykonán, než přistupuje k c1, tedy všechny operace související s c1 nelze dokončit, takže vidíme, že i c1. DoNotLockMe() není vykonávána.
|