程序员的 macOS 技巧:线程处理 · Luna 的博客

主要观点:

  • 多数编写在 macOS 机器上运行代码的人对操作系统及其独特功能和粗糙边缘不熟悉,此文针对此类程序员。
  • 苹果将“语义标签”(服务质量类,QoS 类)分配给工作以优化能耗,有五个 QoS 类,从高到低分别为 User Interactive、User Initiated、Default、Utility、Background,在系统中应用广泛。
  • 线程优先级存在风险,苹果平台有机制可通过特定同步原语解决优先级反转问题,如pthread_mutexos_unfair_lock、Dispatch 队列和工作循环、Mach 消息等,应避免使用读写锁等不可参与 QoS 继承的锁。
  • 新建线程默认 QoS 类为 Default,应根据工作重要性为线程分配 QoS 类,对于像数据库类的线程,可使用 Dispatch 库创建工作循环来处理优先级问题,苹果框架常假设使用 Dispatch,应广泛使用它。

关键信息:

  • 苹果处理器功耗动态范围大,确定代码在功耗尺度上的位置很重要。
  • 不同 QoS 类的工作特点及应用场景,如 User Interactive 工作被抢占会导致应用界面卡顿等。
  • 线程优先级相关风险及解决办法,如使用特定同步原语可避免优先级反转。
  • 新建线程默认 QoS 类及如何为线程分配合适 QoS 类,Dispatch 库的优势及应用。

重要细节:

  • 苹果在系统各方面广泛应用 QoS 类,如 CPU 调度、I/O 节流等,Background QoS 工作在 iOS 低功耗模式下会暂停等。
  • 优先使用os_unfair_lock,避免使用读写锁等,Dispatch 可创建工作循环和队列,处理优先级问题更方便,苹果框架常假设使用 Dispatch。
  • 存在第六个鲜为人知的 QoS 类 Maintenance,可通过 XPC 活动访问,但未测试。
阅读 7
0 条评论