【发布时间】:2014-04-19 08:01:58
【问题描述】:
我对 NSRunLoop 能够在不占用大量 CPU 的情况下空闲/休眠其线程的能力很感兴趣。在 Objective-c 中是如何实现的?消耗高 CPU 的简单解决方案是 while(YES) {...}
【问题讨论】:
标签: ios objective-c nsrunloop
我对 NSRunLoop 能够在不占用大量 CPU 的情况下空闲/休眠其线程的能力很感兴趣。在 Objective-c 中是如何实现的?消耗高 CPU 的简单解决方案是 while(YES) {...}
【问题讨论】:
标签: ios objective-c nsrunloop
一般来说,有很多系统调用会阻塞。也就是说,它们将导致内核挂起线程并且不给它 CPU 时间,直到发生某些特定事件或状态更改。诸如kevent()、poll()、select()、read() 之类的非纯文件描述符等
关于NSRunLoop,它是围绕CFRunLoop 构建的,它是开源的:https://www.opensource.apple.com/source/CF/CF-855.11/CFRunLoop.c。它在 OS X 和 iOS 上使用 Mach API。特别是,它调用 mach_msg() 来等待输入源(以 Mach 端口的形式)触发(接收消息)或计时器结束。
【讨论】:
本质上,NSRunLoop 是一个
事件驱动模式。我们使用
pipe()生成两个fd(一个用于读取,一个用于写入)。我们可以通过将一些字节写入其他线程的“write” fd 来唤醒线程(读取“read” fd)。
您可以参考此项目以获取更多信息。
https://github.com/wuyunfeng/LightWeightRunLoop(使用BSD kqueue实现iOS RunLoop和一些Runloop-Relative Fundation API,例如在其他线程,Timer,URLConnection等上执行选择器(或延迟一些时间)。)
希望对你有帮助。
【讨论】: