Denna artikel är en spegelartikel om maskinöversättning, klicka här för att hoppa till originalartikeln.

Utsikt: 49134|Svar: 4

[Källa] .NET/C# Lock Principle Monitor ger en djupgående förklaring

[Kopiera länk]
Publicerad på 2021-04-29 09:54:10 | | | |
Lock-satsen tar mutexen av ett givet objekt, exekverar ett satsblock och släpper sedan låset. När man håller ett lås kan gängan som håller låset ta upp och släppa låset igen. Alla andra trådar blockeras från att få låset och väntar tills låset släpps.

Recension:

.net/c# Användaren multitrådad samtidighetslås(sträng){...} Detaljerad förklaring
https://www.itsvse.com/thread-7764-1-1.html

Använd låskoden

Ekvivalent med

Man kan tänka sig att den underliggande koden i Lock implementeras av Monitor.

Eftersom koden använder försök... Finalblock, så även om ett undantag kastas i lock-satsens kropp, släpps locket.

Du kan inte använda låset för await operator i själva satsen.Du kan inte använda det i själva uttalandets huvuddelväntaOperatörslås。 Du kan inte använda låset för await operator i själva satsen. Du kan inte använda låset för await operator i själva satsen. Den här meningen är mycket viktig!

Dokumentation:Inloggningen med hyperlänken är synlig.

Jag testar koden själv,Använd Uppgift för att få låset och använd vänta på att blockera, koden är följande:

Efter att ha kört följande kod flera gånger blir resultatet inte som förväntat.



Varför? Om du försöker använda nyckelordet await när du försöker använda await-nyckelordet i lockblocket, får du detta kompileringsfel: cannot await i brödtexten av en lock-sats. Anledningen är att efter att await är slutfört kan metoden köras i en annan tråd istället för tråden (som anropar tråden) före await-nyckelordet.lockkeywordSamma trådLås och släpp lås i låset
Modifiera koden för att se orsaken mer intuitivt:

Få tag på gäng-id på låset och gäng-id på låssläppet,Uppenbarligen inte i en tråd, så låset kan inte släppas framgångsrikt, som visas i figuren nedan:



Försökte modifiera koden, testade med tråd, körde flera gånger, och det fungerade som förväntat, koden är följande:



(Slut)





Föregående:(to).NET/C# för att paketera mappen till en zip-fil
Nästa:Redis använder Lua-skript för detaljerade förklaringar
 Hyresvärd| Publicerad på 2022-02-10 09:20:09 |

Släpp inte låset





 Hyresvärd| Publicerad på 2023-06-25 19:57:43 |
Objektsynkroniseringsmetoden anropades från ett osynkroniserat kodblock.
Följande kod ger ett fel enligt ovan




 Hyresvärd| Publicerad på 2023-08-12 19:47:49 |
Låssyntaxsocker, som visas nedan:






 Hyresvärd| Publicerad på 2024-07-11 10:44:02 |
【Turn】C# multitrådad samtidighet under olika lås
https://www.itsvse.com/thread-10561-1-1.html
Friskrivning:
All programvara, programmeringsmaterial eller artiklar som publiceras av Code Farmer Network är endast för lärande- och forskningsändamål; Ovanstående innehåll får inte användas för kommersiella eller olagliga ändamål, annars kommer användarna att bära alla konsekvenser. Informationen på denna sida kommer från internet, och upphovsrättstvister har inget med denna sida att göra. Du måste helt radera ovanstående innehåll från din dator inom 24 timmar efter nedladdning. Om du gillar programmet, vänligen stöd äkta programvara, köp registrering och få bättre äkta tjänster. Om det finns något intrång, vänligen kontakta oss via e-post.

Mail To:help@itsvse.com