Swift TaskGroup 中高优先级任务等待低优先级任务持锁为什么会死锁?
导读:本期聚焦于阿亮创作的《Swift TaskGroup 中高优先级任务等待低优先级任务持锁为什么会死锁?》,敬请观看详情。Swift 并发调度把任务组织成树状结构,TaskGroup 创建的子任务会继承父任务优先级,高优先级父任务一旦等待子任务完成,整个分支的调度权重都会上升。当低优先级任务持有 NSLock 或 pthread_mutex 这类阻塞锁时,运行时无法感知锁的归属,也不会像 actor 那样自动提升低优先级任务的执行优先级。于是高优先级分支里的子任务全部阻塞在 lock 调用上,父任务又通过 withTaskGroup 挂起等待;此时全局协作线程池如果被这些挂起但占用线程的高优先级任务占满,低优先级持锁任务就得不到线程去继续执行解锁,形成典型的死锁。本文结合可复现示例拆解 TaskGroup 的优先级传播机制,说明优先级继承只在 actor 协作式等待中生效、对阻塞锁无效的边界,并给出改用 actor 隔离、异步信号量、锁粒度收缩和任务取消超时等可落地方案。
栏目:IOS/MAC 时间:10-20 Swift TaskGroup
