MST

星途 面试题库

面试题:Objective-C多线程下GCD队列同步与异步操作的错误诊断

假设你在Objective-C项目中使用Grand Central Dispatch(GCD)进行多线程编程,遇到了由于同步和异步队列操作导致的程序逻辑错误。请阐述你将如何分析和定位这些错误,比如从队列的优先级、任务执行顺序、资源竞争等方面考虑,并说明如何运用 Instruments 工具辅助诊断。
28.1万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

1. 分析和定位错误思路

  • 队列优先级
    • 排查要点:不同优先级队列执行任务的先后顺序可能影响程序逻辑。高优先级队列任务可能抢占低优先级队列任务的执行机会。
    • 分析方法:检查任务分配到的队列优先级设置是否合理。例如,某些需要及时响应的任务是否被误放在低优先级队列,而一些后台任务却在高优先级队列,导致前台任务响应不及时。查看代码中创建队列时使用的 dispatch_queue_attr_make_with_qos_class 等设置优先级的函数调用,确认优先级设置与任务需求匹配。
  • 任务执行顺序
    • 排查要点:异步队列任务执行顺序是无序的,而同步队列任务按顺序执行。如果对任务执行顺序有依赖,可能因错误使用同步/异步队列导致逻辑错误。
    • 分析方法:梳理任务之间的逻辑依赖关系。检查是否存在某个任务需要等待另一个任务完成后才能执行,但却被放到异步队列中并行执行的情况。可以在关键任务的开始和结束处添加日志输出,通过日志分析任务实际执行顺序与预期顺序的差异。
  • 资源竞争
    • 排查要点:多个线程同时访问和修改共享资源时可能引发资源竞争问题,导致数据不一致或程序崩溃。
    • 分析方法:确定程序中哪些资源是共享的,如全局变量、文件句柄等。检查对共享资源的访问代码,是否在多线程环境下进行了适当的同步控制,例如是否使用了 dispatch_semaphore 信号量、@synchronized 块或 NSLock 等机制来保护共享资源。

2. Instruments 工具辅助诊断

  • 使用 Time Profiler
    • 操作步骤:打开 Instruments,选择 Time Profiler 模板,运行目标应用程序。
    • 作用:Time Profiler 可以展示每个函数的执行时间和调用次数。通过分析热点函数,可以发现哪些任务执行时间过长,可能影响整体程序逻辑,也能辅助判断任务是否按预期顺序执行,例如某些依赖任务是否延迟执行。
  • 使用 Thread Sanitizer
    • 操作步骤:在 Xcode 中,选择 Product -> Scheme -> Edit Scheme,在 Diagnostics 标签中勾选 Thread Sanitizer,然后运行应用程序。
    • 作用:Thread Sanitizer 专门检测线程竞争问题。当检测到资源竞争时,它会给出详细的错误信息,包括竞争发生的代码位置、涉及的线程等,帮助快速定位资源竞争点。
  • 使用 GCD Analyzer
    • 操作步骤:在 Instruments 中选择 GCD Analyzer 模板,运行应用程序。
    • 作用:GCD Analyzer 能分析 GCD 队列的使用情况,如队列是否过度使用、任务是否正确调度等。它可以显示队列的执行状态、任务提交和完成时间等信息,有助于从队列层面分析同步和异步操作导致的逻辑错误。