Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 49134|Відповідь: 4

[Джерело] .NET/C# Lock Principle Monitor надає детальне пояснення

[Копіювати посилання]
Опубліковано 29.04.2021 09:54:10 | | | |
Оператор блокування приймає mutex заданого об'єкта, виконує блок операторів, а потім знімає блокування. При утриманні замка різьба може знову захопити і відпустити замок. Будь-яка інша тема блокується і чекає, поки замок буде звільнений.

Огляд:

.net/c# Користувацький багатопотоковий concurrency lock(string){...} Детальне пояснення
https://www.itsvse.com/thread-7764-1-1.html

Використовуйте код замка

Еквівалент

Можна припустити, що базовий код Lock реалізований Monitor.

Оскільки код використовує try... Finalblock, тобто навіть якщо виняток додано в основі блокування, блокування звільняється.

Ви не можете використовувати блокування оператора очікування в тексті заяви.Ви не можете використовувати його в основній частині заявиЧекайтеОператорський замок。 Ви не можете використовувати блокування оператора очікування в тексті заяви. Ви не можете використовувати блокування оператора очікування в тексті заяви. Це речення дуже важливе!

Документації:Вхід за гіперпосиланням видно.

Я сам тестую код,Використовуйте Завдання, щоб отримати замок, і використовуй Wait, щоб заблокувати, код виглядає так:

Після кількох виконань наступного коду результат виконання не відповідає очікуванням.



Чому? Якщо ви спробуєте використати ключове слово await при спробі використати ключове слово await у блоці блокування, отримаєте помилку компіляції: unable waitit у тілі блокування. Причина в тому, що після завершення await метод може запускатися в іншому потоці замість потоку (викликаючи поток) перед ключовим словом await.lockkeywordТа сама темаВстанови замок і відпусти замок у замку
Модифікуйте код, щоб інтуїтивно бачити причину:

Отримайте ідентифікатор різьби замка та ідентифікатор різьби розблокування,Звісно, не в темі, тому замок не може бути успішно відкритий, як показано на рисунку нижче:



Пробував змінювати код, тестував за допомогою потоку, виконував кілька разів, і все працювало як очікувалося, код виглядає так:



(Кінець)





Попередній:(to).NET/C# для пакування папки у zip-файл
Наступний:Redis використовує скрипти Lua для детальних пояснень
 Орендодавець| Опубліковано 10.02.2022 09: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