Dit artikel is een spiegelartikel van machinevertaling, klik hier om naar het oorspronkelijke artikel te gaan.

Bekijken: 49134|Antwoord: 4

[Bron] .NET/C# Lock Principle Monitor biedt een diepgaande uitleg

[Link kopiëren]
Geplaatst op 29-04-2021 09:54:10 | | | |
De lock-instructie neemt de mutex van een gegeven object, voert een statementblok uit en geeft vervolgens de lock op. Wanneer je een slot vasthoudt, kan de schroefdraad die het slot vasthoudt het slot oppakken en weer loslaten. Elke andere draad wordt geblokkeerd zodat het slot niet kan worden gepakt en wacht tot het slot wordt losgemaakt.

Recensie:

.net/c# Gebruiker multithreaded concurrency lock(string){...} Gedetailleerde uitleg
https://www.itsvse.com/thread-7764-1-1.html

Gebruik de slotcode

Equivalent aan

Men kan denken dat de onderliggende code van Lock door Monitor wordt geïmplementeerd.

Aangezien de code probeert... Finalblock, dus zelfs als er een uitzondering in de body van de lock-instructie wordt geplaatst, wordt de lock losgelaten.

Je kunt de await operator lock niet in de body van de instructie gebruiken.Je kunt het niet in de inhoud van de verklaring gebruikenwachtOperator slot。 Je kunt de await operator lock niet in de body van de instructie gebruiken. Je kunt de await operator lock niet in de body van de instructie gebruiken. Deze zin is heel belangrijk!

Documentatie:De hyperlink-login is zichtbaar.

Ik test de code zelf,Gebruik Taak om de lock te krijgen en gebruik 'wacht om te blokkeren', de code is als volgt:

Na het meerdere keren uitvoeren van de volgende code is het uitvoeringsresultaat niet zoals verwacht.



Waarom? Als je probeert het await-keyword te gebruiken wanneer je het await-sleutelwoord in het lock block probeert te gebruiken, krijg je deze compilatiefout: cannot await in de body van een lock-instructie. De reden is dat nadat await is voltooid, de methode in een andere thread kan draaien in plaats van in de thread (die thread aanroept) vóór het await-sleutelwoord.lockkeywordZelfde draadVergrendel en laat slot los in het slot
Pas de code aan om de reden intuïtiever te zien:

Krijg de schroefdraad-id van het slot en de schroefdraad-ID van de slotontgrendeling,Natuurlijk niet in een draadje, dus de vergrendeling kan niet succesvol worden losgemaakt, zoals getoond in de onderstaande figuur:



Ik heb geprobeerd de code aan te passen, getest met thread, meerdere keren uitgevoerd, en het werkte zoals verwacht, de code is als volgt:



(Einde)





Vorig:(to).NET/C# om de map te verpakken in een zipbestand
Volgend:Redis gebruikt Lua-scripts voor gedetailleerde uitleg
 Huisbaas| Geplaatst op 10-02-2022 09:20:09 |

Maak het slot niet los





 Huisbaas| Geplaatst op 25-06-2023 19:57:43 |
De objectsynchronisatiemethode werd aangeroepen vanuit een niet-gesynchroniseerd codeblok.
De volgende code geeft een foutmelding als hierboven




 Huisbaas| Geplaatst op 12-08-2023 19:47:49 |
Lock syntax suiker, zoals hieronder weergegeven:






 Huisbaas| Geplaatst op 11-07-2024 10:44:02 |
【Turn】C# multithreaded concurrency onder verschillende locks
https://www.itsvse.com/thread-10561-1-1.html
Disclaimer:
Alle software, programmeermaterialen of artikelen die door Code Farmer Network worden gepubliceerd, zijn uitsluitend bedoeld voor leer- en onderzoeksdoeleinden; De bovenstaande inhoud mag niet worden gebruikt voor commerciële of illegale doeleinden, anders dragen gebruikers alle gevolgen. De informatie op deze site komt van het internet, en auteursrechtconflicten hebben niets met deze site te maken. Je moet bovenstaande inhoud volledig van je computer verwijderen binnen 24 uur na het downloaden. Als je het programma leuk vindt, steun dan de echte software, koop registratie en krijg betere echte diensten. Als er sprake is van een inbreuk, neem dan contact met ons op via e-mail.

Mail To:help@itsvse.com