Реализация NSRunLoop

Я заинтересован в реализации возможности NSRunLoop для простоя / ожидания его потока без интенсивной загрузки процессора. Как это достигается в Objective-c? Наивное решение, которое потребляет высокую загрузку процессора, - это пока (ДА) {...}

2 ответа

Решение

Вообще говоря, существует множество системных вызовов, которые будут блокироваться. То есть они заставят ядро ​​приостановить поток и не дать ему время ЦП, пока не произойдет какое-то конкретное событие или изменение состояния. Вещи как kevent(), poll(), select(), read() на дескриптор не простого файла и т. д.

В отношении к NSRunLoop в частности, он построен вокруг CFRunLoop, который является открытым исходным кодом: https://www.opensource.apple.com/source/CF/CF-855.11/CFRunLoop.c. Он использует Mach API на OS X и iOS. В частности, это вызывает mach_msg() ждать источников входного сигнала (в форме портов Маха), чтобы сработали (получить сообщения) или таймеры истекли.

По сути, NSRunLoop является

Event-Driven-Mode. Мы используем pipe() сгенерировать два fd(один для чтения, один для записи). Мы можем активировать поток (который читает fd "read"), записав несколько байтов, чтобы "записать" fd в другой поток.

Вы можете ссылаться на этот проект для получения дополнительной информации.

https://github.com/wuyunfeng/LightWeightRunLoop (при использовании BSD kqueue реализуйте iOS RunLoop и некоторые API-интерфейсы Runloop-Relative Fundation, такие как селектор выполнения (или задержка несколько раз) в другом потоке, таймере, URLConnection и т. д.)

Надеюсь, это поможет вам.

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