Tento článek je zrcadlovým článkem o strojovém překladu, klikněte zde pro přechod na původní článek.

Pohled: 49134|Odpověď: 4

[Zdroj] .NET/C# Monitor principů zámků poskytuje podrobné vysvětlení

[Kopírovat odkaz]
Zveřejněno 29.04.2021 9:54:10 | | | |
Příkaz zámku vezme mutex daného objektu, vykoná blok příkazů a poté uvolní zámek. Při držení zámku může nit, která zámek drží, zámek znovu zachytit a uvolnit. Jakékoliv jiné vlákno je zablokováno a čeká na uvolnění zámku.

Přezkoumání:

.net/c# Uživatelský vícevláknový souběžný zámek(string){...} Podrobné vysvětlení
https://www.itsvse.com/thread-7764-1-1.html

Použijte kód zámku

Ekvivalent

Lze se domnívat, že základní kód Locku je implementován pomocí Monitoru.

Protože kód používá try... Finalblock, takže i když je v těle příkazu zámku vložena výjimka, zámek je uvolněn.

Nelze použít zámek await operator v těle výroku.Nemůžete ji použít v těle tvrzeníčekatOperátorský zámek。 Nelze použít zámek await operator v těle výroku. Nelze použít zámek await operator v těle výroku. Tato věta je velmi důležitá!

Dokumentace:Přihlášení k hypertextovému odkazu je viditelné.

Kód testuji sám,Použijte Úkol k získání zámku a použijte čekání k blokování, kód je následující:

Po několika provedeních následujícího kódu není výsledek vykonání tak, jak se očekávalo.



Proč? Pokud se pokusíte použít klíčové slovo await při použití klíčového slova await v lockblocku, dostanete tuto chybu kompilace: cannot await v těle příkazu lock. Důvodem je, že po dokončení čekaní může metoda běžet v jiném vlákně místo vlákna (volajícího vlákno) před klíčovým slovem wait.lockkeywordStejné vláknoZamkni a uvolni zamkni zámek
Upravte kód, abyste intuitivněji viděli důvod:

Získejte ID závitu zámku a ID závitu uvolnění zámku,Samozřejmě ne v žádném vlákně, takže zámek nelze úspěšně uvolnit, jak je znázorněno na obrázku níže:



Zkoušel jsem upravovat kód, testoval jsem s vláknem, spouštěl to několikrát a fungovalo to podle očekávání, kód je následující:



(Konec)





Předchozí:(to).NET/C# pro zabalení složky do zip souboru
Další:Redis používá písma Lua pro podrobná vysvětlení
 Pronajímatel| Zveřejněno 10.02.2022 9:20:09 |

Neodpusťujte zámek





 Pronajímatel| Zveřejněno 25.06.2023 19:57:43 |
Metoda synchronizace objektů byla volána z nesynchronizovaného bloku kódu.
Následující kód vám dá chybu jako výše




 Pronajímatel| Zveřejněno 12.08.2023 19:47:49 |
Syntax zámků cukr, jak je uvedeno níže:






 Pronajímatel| Zveřejněno 11.07.2024 10:44:02 |
【Turn】C# vícevláknová souběžnost pod různými zámky
https://www.itsvse.com/thread-10561-1-1.html
Zřeknutí se:
Veškerý software, programovací materiály nebo články publikované organizací Code Farmer Network slouží pouze k učení a výzkumu; Výše uvedený obsah nesmí být používán pro komerční ani nelegální účely, jinak nesou všechny důsledky uživatelé. Informace na tomto webu pocházejí z internetu a spory o autorská práva s tímto webem nesouvisí. Musíte výše uvedený obsah ze svého počítače zcela smazat do 24 hodin od stažení. Pokud se vám program líbí, podporujte prosím originální software, kupte si registraci a získejte lepší skutečné služby. Pokud dojde k jakémukoli porušení, kontaktujte nás prosím e-mailem.

Mail To:help@itsvse.com