XCode14线程警告问题

最近收到了一些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 后台优先级

猜你喜欢

转载自blog.csdn.net/weixin_38201792/article/details/129237938
今日推荐