Я хотел бы понять, как на самом деле работает ожидание потока?
Есть ли за сценой бесконечный цикл (не звучит резонансно)?
Например, на странице руководства MSDN / MFC для функции «WaitForSingleObject» написано
Функция WaitForSingleObject проверяет текущее состояние указанного объекта. Если состояние объекта не обозначено, вызывающий поток переходит в состояние ожидания до объект сигнализируется или истекает интервал времени ожидания.
(http://msdn.microsoft.com/en-us/library/windows/desktop/ms687032(v=vs.85).aspx)
Что это за «состояние ожидания»?
Как поток «просыпается», т. Е. Как возникновение события или сигнала объекта вызывает повторный запуск потока?
Кто проверяет объект синхронизации и как часто?
Спасибо
Это обрабатывается планировщиком потока ОС.
Когда поток ожидает чего-либо, ОС создает ссылку из объекта, которого ожидает, обратно к ожидающему объекту. Когда состояние ожидаемого объекта изменяется, планировщик просматривает ожидающие его объекты. Если изменение состояния разблокирует любой из них, оно помечает их как разблокированные, поэтому они становятся пригодными для планирования.
Планировщик затем имеет алгоритмы для выбора того, какие потоки, которые имеют право на планирование, будут фактически запланированы для запуска. Точные детали меняются между операционными системами (и даже между версиями одной и той же операционной системы), но, исходя из того, что вы спросили, я думаю, что вы, вероятно, сейчас не сильно беспокоитесь об этом.
Суть в том, что как только поток блокируется таким образом (практически), процессорное время не тратится на проверку того, может ли он снова работать. Вместо того, чтобы проходить через все заблокированные потоки и видеть, изменилась ли ситуация, чтобы любой из них мог работать, он смотрит только на изменения в ситуации и, когда они происходят, выясняет, какие потоки позволят работать.
Конечно, также возможно, что по крайней мере в теории некоторые ОС мог работают по-другому, но Windows определенно работает почти так же, как описано выше, и большинство других типичных систем (например, Linux, * BSD, MacOS) очень похожи в этом отношении.