收藏ios多线程

dispatch_semaphore优先级反转

2021-03-20  本文已影响0人  雷霸龙

与 OSSpinlock类似,使用 dispatch_semaphore 容易造成优先级反转:

高效率的线程同步有两个关键点:

自旋锁是两点都不符合,dispatch_semaphore 是只符合不忙等。

原理说明

下面先介绍一下 iOS 平台上的 QoS 概念和优先级反转避免机制,最后再说明为什么 dispatch_semaphore 不能避免优先级反转。

1. QoS 传递

QoS(Quality of Service),用来指示某任务或队列的运行优先级。

调度程序会根据这些信息决定 block 以什么优先级运行。
如果没有其他线程同步地等待此 block,则 block 就按上面所说的优先级来运行。
如果出现了线程间同步等待的情况,则调度程序会根据情况调整线程的运行优先级。

2、优先级反转及避免

优先级反转:当前线程在同步地等待某个线程(线程1)完成某项操作,而当前线程的优先级比线程1的优先级高。

优先级反转避免机制(Priority inversion avoidance):如果当前线程因等待某线程(线程1)上正在进行的操作(如 block1)而受阻,而系统知道 block1 所在的目标线程(owner),系统会通过提高相关线程的优先级来解决优先级反转的问题。

使用以上这些 API 能够在发生优先级反转时使系统启用优先级反转避免机制。

3、dispatch_semaphroe 不能避免优先级反转的原因

dispatch_group 跟 semaphore 类似,在调用 enter() 方法时,无法预知谁会调用 leave(),所以系统也无法知道其 owner 是谁

上一篇 下一篇

猜你喜欢

热点阅读