Тази статия е огледална статия за машинен превод, моля, кликнете тук, за да преминете към оригиналната статия.

Изглед: 49134|Отговор: 4

[Източник] .NET/C# Lock Principle Monitor предоставя подробно обяснение

[Копирай линк]
Публикувано в 29.04.2021 г. 9:54:10 ч. | | | |
Операторът lock приема mutex на даден обект, изпълнява блок с оператори и след това освобождава заключването. Когато държите заключване, резбата, която го държи, може да я закачи и освободи отново. Всяка друга нишка е блокирана от получаване на ключалката и чака, докато ключалката бъде освободена.

Преглед:

.net/c# Потребителски многонишков конкурентен lock(string){...} Подробно обяснение
https://www.itsvse.com/thread-7764-1-1.html

Използвай кода на заключването

Еквивалент на

Може да се предположи, че основният код на Lock е реализиран от Monitor.

Тъй като кодът използва try... Finalblock, така че дори ако изключение е хвърлено в тялото на заключващото изявление, заключването се освобождава.

Не можете да използвате заключването на оператора в тялото на изявлението.Не можете да го използвате в основната част на изявлениетоЧакайЗаключване на оператора。 Не можете да използвате заключването на оператора в тялото на изявлението. Не можете да използвате заключването на оператора в тялото на изявлението. Това изречение е много важно!

Документация:Входът към хиперлинк е видим.

Тествам кода сам,Използвай Задача, за да вземеш заключването, и използвай Wait, за да блокираш, кодът е следният:

След изпълнение на следващия код няколко пъти, резултатът от изпълнението не е такъв, какъвто се очаква.



Защо? Ако опитате да използвате ключовата дума wait, когато се опитвате да използвате ключовата дума await в блока за заключване, ще получите тази грешка при компилацията: не може да чака в тялото на заключващо изявление. Причината е, че след като waitit приключи, методът може да се изпълнява в различна нишка, вместо в нишката (извикващ нишка) преди ключовата дума waitit.ключова дума lockСъщата темаВземи заключване и освобождаване на заключването в ключалката
Модифицирайте кода, за да видите причината по-интуитивно:

Вземи идентификатора на резбата на заключването и идентификатора на резбата на освобождаването на заключването,Очевидно не в тема, така че заключването не може да бъде успешно отключено, както е показано на фигурата по-долу:



Опитах да модифицирам кода, тествах с нишка, изпълнявах се няколко пъти и работеше както се очаква, кодът е следният:



(Край)





Предишен:(to).NET/C# за пакетиране на папката в zip файл
Следващ:Redis използва Lua скрипти за подробни обяснения
 Хазяин| Публикувано в 10.02.2022 г. 9:20:09 ч. |

Не отваряй ключалката





 Хазяин| Публикувано в 25.06.2023 г. 19:57:43 ч. |
Методът за синхронизация на обекти се извикваше от несинхронизиран блок код.
Следващият код ще даде грешка, както по-горе




 Хазяин| Публикувано в 12.08.2023 г. 19:47:49 ч. |
Заключване на синтаксис, захар, както е показано по-долу:






 Хазяин| Публикувано в 11.07.2024 г. 10:44:02 ч. |
【Turn】C# многонишкова паралелност под различни заключвания
https://www.itsvse.com/thread-10561-1-1.html
Отричане:
Целият софтуер, програмни материали или статии, публикувани от Code Farmer Network, са само за учебни и изследователски цели; Горното съдържание не трябва да се използва за търговски или незаконни цели, в противен случай потребителите ще понесат всички последствия. Информацията на този сайт идва от интернет, а споровете за авторски права нямат нищо общо с този сайт. Трябва напълно да изтриете горното съдържание от компютъра си в рамките на 24 часа след изтеглянето. Ако ви харесва програмата, моля, подкрепете оригинален софтуер, купете регистрация и получете по-добри услуги. Ако има нарушение, моля, свържете се с нас по имейл.

Mail To:help@itsvse.com