Оператор блокування приймає mutex заданого об'єкта, виконує блок операторів, а потім знімає блокування. При утриманні замка різьба може знову захопити і відпустити замок. Будь-яка інша тема блокується і чекає, поки замок буде звільнений.
Огляд:
Використовуйте код замка
Еквівалент
Можна припустити, що базовий код Lock реалізований Monitor.
Оскільки код використовує try... Finalblock, тобто навіть якщо виняток додано в основі блокування, блокування звільняється.
Ви не можете використовувати блокування оператора очікування в тексті заяви.Ви не можете використовувати його в основній частині заявиЧекайтеОператорський замок。 Ви не можете використовувати блокування оператора очікування в тексті заяви. Ви не можете використовувати блокування оператора очікування в тексті заяви. Це речення дуже важливе!
Документації:Вхід за гіперпосиланням видно.
Я сам тестую код,Використовуйте Завдання, щоб отримати замок, і використовуй Wait, щоб заблокувати, код виглядає так:
Після кількох виконань наступного коду результат виконання не відповідає очікуванням.
Чому? Якщо ви спробуєте використати ключове слово await при спробі використати ключове слово await у блоці блокування, отримаєте помилку компіляції: unable waitit у тілі блокування. Причина в тому, що після завершення await метод може запускатися в іншому потоці замість потоку (викликаючи поток) перед ключовим словом await.lockkeywordТа сама темаВстанови замок і відпусти замок у замку。 Модифікуйте код, щоб інтуїтивно бачити причину:
Отримайте ідентифікатор різьби замка та ідентифікатор різьби розблокування,Звісно, не в темі, тому замок не може бути успішно відкритий, як показано на рисунку нижче:
Пробував змінювати код, тестував за допомогою потоку, виконував кілька разів, і все працювало як очікувалося, код виглядає так:
(Кінець)
|