1. Kāpēc bloķēt un kas ir bloķēts?
Kad mēs izmantojam pavedienus, visefektīvākais veids, protams, ir asinhrons, tas ir, katrs pavediens darbojas vienlaicīgi, nepaļaujoties viens uz otru un gaidot. Tomēr, ja dažādiem pavedieniem ir jāpiekļūst noteiktam resursam, ir nepieciešams sinhronizācijas mehānisms, tas ir, lasot un rakstot vienu un to pašu resursu, mums ir jāpadara resurss, ko vienlaikus darbina tikai viens pavediens, lai nodrošinātu, ka katra darbība ir efektīva un tūlītēja, tas ir, lai nodrošinātu tās darbības atomiskumu. bloķēšana ir visbiežāk izmantotā sinhronizācijas metode C# formātā lock(objectA){codeB}.
lock(objectA){codeB} šķiet vienkāršs, bet patiesībā tam ir trīs nozīmes, kas ir būtiski, lai to pareizi izmantotu: 1. Vai objectA ir bloķēts? Ja nē, es to bloķēšu, pretējā gadījumā pagaidiet, kamēr objektsA tiks atbrīvots. 2. Pēc bloķēšanas citi pavedieni nevar izsaukt kodu B vai izmantot objektu A koda B izpildes laikā. 3. Pēc codeB izpildes atbrīvojiet objektuA un codeB var piekļūt ar citiem pavedieniem.
2. Kas notika ar slēdzeni?
Apskatīsim piemēru:
T1 pavedienā LockMe izsauc lock(this), tas ir, c1 galvenajā funkcijā, un, izsaucot lock(c1) galvenajā pavedienā, pirms piekļuves c1 ir jāgaida, līdz tiks izpildīts bloķēšanas bloks t1, tas ir, visas ar c1 saistītās darbības nevar pabeigt, tāpēc mēs redzam, ka pat c1. DoNotLockMe() netiek izpildīts.
|