【问题标题】:NSRunLoop ImplementationNSRunLoop 实现
【发布时间】:2014-04-19 08:01:58
【问题描述】:

我对 NSRunLoop 能够在不占用大量 CPU 的情况下空闲/休眠其线程的能力很感兴趣。在 Objective-c 中是如何实现的?消耗高 CPU 的简单解决方案是 while(YES) {...}

【问题讨论】:

    标签: ios objective-c nsrunloop


    【解决方案1】:

    一般来说,有很多系统调用会阻塞。也就是说,它们将导致内核挂起线程并且不给它 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 端口的形式)触发(接收消息)或计时器结束。

    【讨论】:

      【解决方案2】:

      本质上,NSRunLoop 是一个

      事件驱动模式。我们使用pipe() 生成两个fd(一个用于读取,一个用于写入)。我们可以通过将一些字节写入其他线程的“write” fd 来唤醒线程(读取“read” fd)。

      您可以参考此项目以获取更多信息。

      https://github.com/wuyunfeng/LightWeightRunLoop(使用BSD kqueue实现iOS RunLoop和一些Runloop-Relative Fundation API,例如在其他线程,Timer,URLConnection等上执行选择器(或延迟一些时间)。)

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 2012-08-30
        • 2012-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多