1. Miks lukustada ja mis on lukus?
Kui me kasutame lõime, on kõige tõhusam viis muidugi asünkroonne, st iga lõim töötab samaaegselt, ilma üksteisest sõltumata ja ootamata. Kui aga erinevad lõimed vajavad juurdepääsu teatud ressursile, on vaja sünkroniseerimismehhanismi, st sama ressursi lugemisel ja kirjutamisel peame tegema ressursi samaaegselt ainult ühe lõime poolt, et tagada iga operatsiooni tõhusus ja kohene, st tagada selle aatomiline toimimine. lukk on C# kõige sagedamini kasutatav sünkroniseerimismeetod formaadis lock(objectA){codeB}.
lock(objectA){codeB} tundub lihtne, kuid sellel on tegelikult kolm tähendust, mis on selle sobivaks kasutamiseks hädavajalik: 1. Kas objektA on lukus? Kui mitte, lukustan selle, muidu ootan, kuni objektA vabastatakse. 2. Pärast lukustamist ei saa teised lõimed codeB kutsuda ega kasutada objectA-d codeB täitmise ajal. 3. Pärast codeB käivitamist pääsevad välja objektile A ja codeB-le ligi teised lõimed.
2. Mis juhtus selle lukuga?
Vaatame näidet:
t1 lõimes kutsub LockMe lock(this) ehk c1 põhifunktsioonis ning kui kutsutakse lock(c1) põhilõime, peab ta ootama, kuni lukuplokk t1-s täitub, enne kui pääseb c1-le, st kõiki c1-ga seotud toiminguid ei saa lõpule viia, nii et näeme, et isegi c1. DoNotLockMe() ei ole täidetud.
|