1. Zakaj zaklepati in kaj je zaklenjeno?
Ko uporabljamo niti, je najučinkovitejši način seveda asinhron, torej vsaka nit teče hkrati, brez zanašanja ena na drugo in čakanja. Vendar pa, ko različne niti potrebujejo dostop do določenega vira, je potreben sinhronizacijski mehanizem, torej pri branju in zapisovanju istega vira moramo zagotoviti, da vir deluje le z eno nitjo hkrati, da zagotovimo učinkovitost in takojšnjo delovanje vsake operacije, torej atomovost njenega delovanja. lock je najpogosteje uporabljena metoda sinhronizacije v C#, v formatu lock(objectA){codeB}.
lock(objectA){codeB} se zdi preprost, vendar ima v resnici tri pomene, kar je bistveno za ustrezno uporabo: 1. Ali je objektA zaklenjen? Če ne, ga zaklenem, sicer počakam, da se objekt A sprosti. 2. Po zaklepanju druge niti ne morejo klicati kode B ali uporabljati objekta A med izvajanjem kode B. 3. Po izvedbi kode B lahko druge niti dostopajo do sprostitvenih objektov A in kode B.
2. Kaj se je zgodilo s ključavnico (to)?
Poglejmo primer:
V t1 niti LockMe kliče lock(this), torej c1 v glavni funkciji, in ko kliče lock(c1) v glavni niti, mora počakati, da se lock block v t1 izvede, preden dostopa do c1, torej nobenih operacij, povezanih s c1, ni mogoče dokončati, zato vidimo, da celo c1. DoNotLockMe() se ne izvrši.
|