Ten artykuł jest lustrzanym artykułem tłumaczenia maszynowego, kliknij tutaj, aby przejść do oryginalnego artykułu.

Widok: 49134|Odpowiedź: 4

[Źródło] .NET/C# Lock Principle Monitor zapewnia szczegółowe wyjaśnienie

[Skopiuj link]
Opublikowano 29.04.2021 09:54:10 | | | |
Instrukcja blokady przyjmuje mutex danego obiektu, wykonuje blok instrukcji, a następnie zwalnia blokadę. Podczas trzymania zamka nić trzymająca zamek może go ponownie złapać i zwolnić. Każdy inny gwint jest zablokowany i czeka, aż zamek zostanie zwolniony.

Recenzja:

.net/c# Wielowątkowaty blokada współbieżności użytkownika (string){...} Szczegółowe wyjaśnienie
https://www.itsvse.com/thread-7764-1-1.html

Użyj kodu zamka

Równoważne

Można sądzić, że podstawowy kod Lock jest zaimplementowany przez Monitor.

Ponieważ kod stosuje się try... Finalblock, więc nawet jeśli w treści instrukcji blokady zostanie wrzucony wyjątek, blokada zostaje zwolniona.

Nie możesz użyć blokady operatora await w treści zdania.Nie możesz użyć go w treści oświadczeniaczekajcieBlokada operatora。 Nie możesz użyć blokady operatora await w treści zdania. Nie możesz użyć blokady operatora await w treści zdania. To zdanie jest bardzo ważne!

Dokumentacja:Logowanie do linku jest widoczne.

Sam testuję kod,Użyj Zadania, aby zdobyć blokadę, i użyj czekaj, aby zablokować, kod jest następujący:

Po kilku wykonaniach następującego kodu wynik wykonania nie jest taki, jak się spodziewał.



Dlaczego? Jeśli spróbujesz użyć słowa kluczowego await podczas próby użycia słowa await w bloku blokady, otrzymasz ten błąd kompilacji: nie można czekać w treści instrukcji blokady. Powodem jest to, że po zakończeniu await metoda może działać w innym wątku zamiast wątku (wywołującego wątek) przed słowem kluczowym oczekuj.lockkeywordTen sam wątekZablokuj i zwolnij zablokuj zamek
Zmodyfikuj kod, aby zrozumieć powód bardziej intuicyjnie:

Uzyskaj identyfikator nici zamka oraz identyfikator nitki zwalniającego zamka,Oczywiście nie na wątku, więc blokady nie można skutecznie zwolnić, jak pokazano na poniższym rysunku:



Próbowałem modyfikować kod, testować z wątkiem, wykonać to wielokrotnie i wszystko działało zgodnie z oczekiwaniami, kod wygląda następująco:



(Koniec)





Poprzedni:(to).NET/C#, aby zapakować folder do pliku zip
Następny:Redis używa pisma Lua do szczegółowych wyjaśnień
 Ziemianin| Opublikowano 10.02.2022 09:20:09 |

Nie zdejmuj zamka





 Ziemianin| Opublikowano 25.06.2023 19:57:43 |
Metoda synchronizacji obiektów była wywoływana z niezsynchronizowanego bloku kodu.
Poniższy kod da błąd jak powyżej




 Ziemianin| Opublikowano 12.08.2023 19:47:49 |
Sugar składni zamka, jak pokazano poniżej:






 Ziemianin| Opublikowano 11.07.2024 10:44:02 |
【Turn】C# wielowątkowa współbieżność pod różnymi blokadami
https://www.itsvse.com/thread-10561-1-1.html
Zrzeczenie się:
Całe oprogramowanie, materiały programistyczne lub artykuły publikowane przez Code Farmer Network służą wyłącznie celom edukacyjnym i badawczym; Powyższe treści nie mogą być wykorzystywane do celów komercyjnych ani nielegalnych, w przeciwnym razie użytkownicy ponoszą wszelkie konsekwencje. Informacje na tej stronie pochodzą z Internetu, a spory dotyczące praw autorskich nie mają z nią nic wspólnego. Musisz całkowicie usunąć powyższą zawartość z komputera w ciągu 24 godzin od pobrania. Jeśli spodoba Ci się program, wspieraj oryginalne oprogramowanie, kup rejestrację i korzystaj z lepszych, autentycznych usług. W przypadku naruszenia praw prosimy o kontakt mailowy.

Mail To:help@itsvse.com