Предположим, поток 1 пытается получить блокировку объекта lockObj с помощью оператора lock(lockObj)
, но этот объект уже заблокирован потоком 2 в данный момент. поток 1 пытается заблокировать его. Поток 1 будет заблокирован, верно?
Теперь предположим, что во время этой блокировки происходит переключение контекста, потому что есть другие потоки и приложения, ожидающие запуска. Зависит ли время, прошедшее до тех пор, пока поток 1 снова не перейдет в состояние Работает и сможет получить блокировку, от разрешения таймера ОС (пример: 15,6 мс по умолчанию в Windows 7)?
Если ответ на поставленный выше вопрос ДА, то у меня есть еще одно сомнение:
Легко создать простую программу для проверки средних накладных расходов Thread.Sleep(1)
с помощью секундомера и сделать вывод, что они сходятся к разрешению таймера ОС (например, 15,6 мс). Но мне трудно создать программу, чтобы получить такой же вывод для оператора lock. В основном потому, что:
1) Трудно гарантировать, что поток, пытающийся получить блокировку, всегда будет блокироваться (или, по крайней мере, знать, КОГДА он заблокировал, прежде чем получить блокировку);
2) Я не знаю, как принудительно переключить контекст всякий раз, когда поток пытается получить блоки блокировки. ВСЕГДА есть переключение контекста, когда текущий запущенный поток блокируется?
Любая помощь будет оценена по достоинству.