Реализация 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 и т. д.)
Надеюсь, это поможет вам.