最近收到了一些iOS16系统下的报错,DSYM之后发现是阿里云日志上传的地方出现了警告,调试的时候给出了警告,且这个问题为非必现,占比大概10%~20%,问题如下:
Thread running at QOS_CLASS_USER_INITIATED waiting on a lower QoS thread running at QOS_CLASS_DEFAULT. Investigate ways to avoid priority inversions
这个问题意思大概就是,我们运行在 QOS_CLASS_USER_INITIATED的线程,前方正在运行着一个QOS_CLASS_DEFAULT的低QoS线程,这样有可能造成优先级反转。知道问题之后,修复的方法就清晰了,我们这里修改一下当前线程的优先级:
dispatch_queue_t referQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0); //降低线程优先级dispatch_async(referQueue, ^{ [traker send:dic];});
重复测试多次,发现没有警告了。
顺便解释一下什么事线程的优先级反转和线程的优先级问题!
1、优先级反转
当高优先级的工作依赖于较低优先级的工作时,或者它成为低优先级工作的结果,则会发生优先级反转。结果,可能会发生阻塞、旋转和轮询。
在同步工作的情况下,系统将通过在反转期间提高低优先级工作的QoS来自动解决优先级反转。这将发生在以下情况:
在串行队列上调用dispatch_sync()和dispatch_wait()时。
当调用pthread_mutex_lock()时,互斥对象被一个带有较低QoS的线程所控制。在这种情况下,持有锁的线程被提高到调用者的QoS。但是,这个QoS升级不会出现在多个锁之间。
在异步工作的情况下,系统将尝试解决串行队列中出现的优先级反转
2、线程的优先级
DISPATCH_QUEUE_PRIORITY_HIGH 2 高 DISPATCH_QUEUE_PRIORITY_DEFAULT 0 默认 DISPATCH_QUEUE_PRIORITY_LOW -2 低 DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN 2 后台优先级
来源地址:https://blog.csdn.net/weixin_38201792/article/details/129237938