Как "ждать" в потоке на самом деле работает в C++

Я хотел бы понять, как на самом деле работает ожидание потока? Есть ли за сценой бесконечный цикл (не звучит резонансно)?

Например, на странице справки MSDN/MFC для функции "WaitForSingleObject" написано

Функция WaitForSingleObject проверяет текущее состояние указанного объекта. Если состояние объекта не было сигнализировано, вызывающий поток переходит в состояние ожидания до тех пор, пока объект не будет сигнализирован или пока не истечет время ожидания. ( http://msdn.microsoft.com/en-us/library/windows/desktop/ms687032%28v=vs.85%29.aspx)

Что это за "состояние ожидания"? Как поток "просыпается", т. Е. Как возникновение события или сигнала объекта заставляет поток снова работать? Кто проверяет объект синхронизации и как часто?

Спасибо

1 ответ

Решение

Это обрабатывается планировщиком потока ОС.

Когда поток ожидает чего-либо, ОС создает ссылку из объекта, которого ожидает, обратно к ожидающему объекту. Когда состояние ожидаемого объекта изменяется, планировщик просматривает ожидающие его объекты. Если изменение состояния разблокирует любой из них, оно помечает их как разблокированные, поэтому они становятся пригодными для планирования.

Планировщик затем имеет алгоритмы для выбора того, какие потоки, которые имеют право на планирование, будут фактически запланированы для запуска. Точные детали меняются между операционными системами (и даже между версиями одной и той же операционной системы), но, исходя из того, что вы спросили, я думаю, что вы, вероятно, сейчас не особо заботитесь об этом.

Суть в том, что, как только поток блокируется таким образом, (практически) не тратится время ЦП на проверку того, сможет ли он снова работать. Вместо того, чтобы просматривать все заблокированные потоки и видеть, изменилась ли ситуация, чтобы любой из них мог работать, он смотрит только на изменения ситуации, и когда они происходят, он выясняет, какие потоки позволят ему работать.

Конечно, также возможно, что, по крайней мере, теоретически некоторые ОС могут работать не так, как это, - но Windows определенно работает так же, как описано выше, и большинство других типичных систем (например, Linux, *BSD, MacOS) очень похожи в это уважение.

Другие вопросы по тегам