Ez a cikk egy tükör gépi fordítás, kérjük, kattintson ide, hogy ugorjon az eredeti cikkre.

Nézet: 49134|Válasz: 4

[Forrás] A .NET/C# Lock Principle Monitor részletes magyarázatot nyújt

[Linket másol]
Közzétéve 2021. 04. 29. 9:54:10 | | | |
A lock utasítás egy adott objektum mutexét veszi, végrehajt egy utasításblokkot, majd feloldja a zárolást. Zár tartása esetén a zárat tartó szál újra elengedheti és elengedheti azt. Bármely más szál blokkolódik abban, hogy a zár megnyíljon, és megvárja, amíg a zár feloldódik.

Szemle:

.net/c# User multithreaded concurrency lock(string){...} Részletes magyarázat
https://www.itsvse.com/thread-7764-1-1.html

Használd a zárkódot

Ekvivalens

Feltételezhető, hogy a Lock mögöttes kódját a Monitor valósította meg.

Mivel a kód próbálja... Végső blokk, tehát még ha kivételt is dobnak a zár szöveg törzsében, a zár feloldódik.

Nem használhatod az await operátor zárolást a nyilatkozat törzsében.Nem használhatod a nyilatkozat törzsébenvárjOperátor zár。 Nem használhatod az await operátor zárolást a nyilatkozat törzsében. Nem használhatod az await operátor zárolást a nyilatkozat törzsében. Ez a mondat nagyon fontos!

Dokumentáció:A hiperlink bejelentkezés látható.

Én magam tesztelem a kódot,Használd a Task-t a zároláshoz, és a wait segítségével blokkolj, a kód a következő:

A következő kód többszöri futtatása után a végrehajtási eredmény nem a vártnak megfelelő.



Miért? Ha megpróbálod használni az await kulcsszót a lock blokkban, akkor ezt a fordítási hibát kapod: nem vár a zár utasítás testében. Ennek oka, hogy a várakozás befejezése után a metódus egy másik szálban futhat a várakozás kulcsszó előtti szál helyett.lockkulcsszava-valUgyanaz a szálZár és elenged zárat a zárban
Módosítsd a kódot, hogy intuitívabban lásd az okot:

Szerezd meg a zár szálazonosítóját és a zárkioldó szál azonosítóját,Nyilván nem egy szálon, így a zár nem engedhető sikeresen, ahogy az alábbi ábrán látható:



Próbáltam módosítani a kódot, szálkal teszteltem, többször is lefuttattam, és a vártoknak megfelelően működött, a kód a következő:



(Vége)





Előző:(to).NET/C# segítségével csomagoljuk a mappát egy zip-fájlba
Következő:Redis Lua szkripteket használ részletes magyarázatokhoz
 Háziúr| Közzétéve 2022. 02. 10. 9:20:09 |

Ne engedd ki a zárat





 Háziúr| Közzétéve 2023. 06. 25. 19:57:43 |
Az objektumszinkronizációs módszert egy szinkronizálatlan kódblokkból hívták meg.
A következő kód a fentiek szerinti hibát ad




 Háziúr| Közzétéve 2023. 08. 12. 19:47:49 |
Lock szintaxis sugar, ahogy az alábbiakban látható:






 Háziúr| Közzétéve 2024. 07. 11. 10:44:02 |
【Turn】C# többszálas párhuzamos különböző zárak alatt
https://www.itsvse.com/thread-10561-1-1.html
Lemondás:
A Code Farmer Network által közzétett összes szoftver, programozási anyag vagy cikk kizárólag tanulási és kutatási célokra szolgál; A fenti tartalmat nem szabad kereskedelmi vagy illegális célokra használni, különben a felhasználók viselik az összes következményet. Az oldalon található információk az internetről származnak, és a szerzői jogi vitáknak semmi köze ehhez az oldalhoz. A fenti tartalmat a letöltés után 24 órán belül teljesen törölni kell a számítógépéről. Ha tetszik a program, kérjük, támogassa a valódi szoftvert, vásároljon regisztrációt, és szerezzen jobb hiteles szolgáltatásokat. Ha bármilyen jogsértés történik, kérjük, vegye fel velünk a kapcsolatot e-mailben.

Mail To:help@itsvse.com