Эта статья является зеркальной статьёй машинного перевода, пожалуйста, нажмите здесь, чтобы перейти к оригиналу.

Вид: 49134|Ответ: 4

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

[Скопировать ссылку]
Опубликовано 29.04.2021 9:54:10 | | | |
Оператор блокировки принимает mutex заданного объекта, выполняет блок операторов и затем освобождает блокировку. При удержании замка резьба, удерживающая замок, может захватить и снова отпустить замок. Любая другая тема блокируется и ждёт, пока замок будет освобождён.

Обзор:

.net/c# Пользовательский многопоточный concurrency lock(string){...} Подробное объяснение
https://www.itsvse.com/thread-7764-1-1.html

Используйте код замка

Эквивалент

Можно предположить, что базовый код Lock реализован компанией Monitor.

Поскольку код использует попытку... Finalblock, то есть даже если в теле блокировки есть исключение, блокировка освобождается.

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

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

Я сам проверяю код,Используйте Задачу, чтобы захватить замок, и использовать Ожидание для блокировки, код следующий:

После нескольких исполнений следующего кода результат выполнения оказывается не таким, как ожидалось.



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

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



Пробовал менять код, тестировал с помощью потоков, выполнял несколько раз, и всё работало как ожидалось, код выглядит следующим образом:



(Конец)





Предыдущий:(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