Acest articol este un articol oglindă al traducerii automate, vă rugăm să faceți clic aici pentru a sări la articolul original.

Vedere: 49134|Răspunde: 4

[Sursă] .NET/C# Monitor de principiu de blocare oferă o explicație detaliată

[Copiază linkul]
Postat pe 29.04.2021 09:54:10 | | | |
Instrucțiunea lock ia mutex-ul unui obiect dat, execută un bloc de instrucțiuni și apoi eliberează blocarea. Când ții o lacătă, firul care o ține poate obține și elibera din nou lacătul. Orice alt fir de ață este blocat să obțină lacătul și așteaptă până când acesta este eliberat.

Recenzie:

.net/c# Lock(string) de concurență multithreaded de utilizator {...} Explicație detaliată
https://www.itsvse.com/thread-7764-1-1.html

Folosește codul de încuietoare

Echivalent cu

Se poate considera că codul de bază al Lock este implementat de Monitor.

Deoarece codul folosește try... finalblock, deci chiar dacă o excepție este aruncată în corpul instrucțiunii blocării, blocajul este eliberat.

Nu poți folosi blocarea operatorului await în corpul instrucțiunii.Nu poți să o folosești în corpul enunțuluiașteaptăBlocarea operatorului。 Nu poți folosi blocarea operatorului await în corpul instrucțiunii. Nu poți folosi blocarea operatorului await în corpul instrucțiunii. Această propoziție este foarte importantă!

Documentație:Autentificarea cu hyperlink este vizibilă.

Eu testez codul,Folosește Task pentru a obține încuietoarea și folosește await pentru a bloca, codul este următorul:

După ce se execută codul următor de mai multe ori, rezultatul execuției nu este așa cum era de așteptat.



De ce? Dacă încerci să folosești cuvântul cheie await când încerci să folosești cuvântul cheie await în blocul de blocare, vei primi această eroare de compilare: cannot await în corpul unei instrucțiuni de blocare. Motivul este că, după finalizarea await, metoda poate rula într-un alt fir de execuție în locul firului (firul apelant) înainte de cuvântul cheie await.cuvântul cheie lock-cheieacelași fir de discuțieIa lacătul și eliberează lacătul în încuietoare
Modifică codul pentru a vedea motivul mai intuitiv:

Obține ID-ul filetei lacătului și ID-ul filetei eliberării lacătului,Evident, nu pe un fir de discuție, astfel încât lacătul nu poate fi eliberat cu succes, așa cum se arată în figura de mai jos:



Am încercat să modific codul, am testat cu firul de execuție, am executat de mai multe ori și a funcționat conform așteptărilor, codul este următorul:



(Sfârșit)





Precedent:(to).NET/C# pentru a împacheta folderul într-un fișier zip
Următor:Redis folosește scripturi Lua pentru explicații detaliate
 Proprietarul| Postat pe 10.02.2022 09:20:09 |

Nu eliberați lacătul





 Proprietarul| Postat pe 25.06.2023 19:57:43 |
Metoda de sincronizare a obiectelor era apelată dintr-un bloc de cod nesincronizat.
Codul următor va da o eroare ca mai sus




 Proprietarul| Postat pe 12.08.2023 19:47:49 |
Sintaxă blocată zahăr, așa cum este prezentat mai jos:






 Proprietarul| Postat pe 11.07.2024 10:44:02 |
【Turn】C# concurență multi-threaded sub diverse blocaje
https://www.itsvse.com/thread-10561-1-1.html
Disclaimer:
Tot software-ul, materialele de programare sau articolele publicate de Code Farmer Network sunt destinate exclusiv scopurilor de învățare și cercetare; Conținutul de mai sus nu va fi folosit în scopuri comerciale sau ilegale, altfel utilizatorii vor suporta toate consecințele. Informațiile de pe acest site provin de pe Internet, iar disputele privind drepturile de autor nu au legătură cu acest site. Trebuie să ștergi complet conținutul de mai sus de pe calculatorul tău în termen de 24 de ore de la descărcare. Dacă îți place programul, te rugăm să susții software-ul autentic, să cumperi înregistrarea și să primești servicii autentice mai bune. Dacă există vreo încălcare, vă rugăm să ne contactați prin e-mail.

Mail To:help@itsvse.com