1.经典例子
2.优先级继承
低优先级的A线程获得互斥锁前,需要先将自己的优先级临时提高,最后处理完后再退回原优先级。
set_priority(20); pthread_mutex_lock(); …. pthread mutex unlock(); set_priority(10);
这样在T3的时候,线程虽然有15的优先级,但是对于已经提升到20的线程A无法形成压制,A就会继续执行,直到T5,线程A解锁,线程C立即获得互斥锁并在20上运行,线程B因为优先级低依然无法获取CPU。
当然,这里把优线级升到20只是特例,实际上,你需要评估所有可能上锁的线程,找到最高优先级,然后升到那里......
显然对于复杂系统这个要求过高了,事实上,在现代的实时操作系统中,这个工作是操作系统替你完成的。当高优先级线程请求互斥锁时,在我们的例子中,T2那个瞬间,因为系统发现锁已经被一个低优先级的先程A给锁了,所以它会把线程A的优先级临时调高,直到A解锁时,优先级再被调回原来。
这里带来一个小知识点,在现代的实时操作系统上,如果需要互斥保护,应尽量使用互斥锁(mutex)。有些传统的程序员喜欢用初始值为1的信号灯(semaphore)。虽然在功效上这两个都能互斥,但信号灯一般系统无法做优先级继承,所以会有优先级反转的隐患。