Если поток вызывает Monitor.Wait(lockObj)
для объекта блокировки, которым он в данный момент не владеет, будет выброшено SyncronizationLockException
.
Я не понимаю смысл этого?Если поток владеет блокировкой и, таким образом, может успешно вызвать Monitor.Wait()
, он просто все равно немедленно снимет блокировку.Почему поток не может просто ждать блокировки, которой он в данный момент не владеет?
Обновление
Я решил добавить немного больше объяснений к моему вопросу.
Из того, что я понимаю, Wait просто помещает текущий поток в очередь ожидания мониторов и снимает блокировку.Позже импульс или импульс все перемещает один или все потоки в очереди ожидания в очередь готовности.Всякий раз, когда монитор освобождается, следующей (если таковой имеется) поток в очереди готовности получает блокировку.
Так почему же ожидание не может просто добавить поток в очередь ожидания?Почему для этого нужно получить блокировку?Есть ли физическая причина для этого или просто то, что Microsoft разработала этот класс, чтобы заставить вас правильно его использовать?
Теперь, когда я думаю об этом, я полагаю, что что-то стоит в очереди ожидания монитора или перемещаетготовая очередь действительно манипулирует монитором.Было бы разумно, чтобы для этого вам понадобился собственный монитор.Это правильный способ думать об этом?
Мы многопоточны, мой мозг труден!