其他分享
首页 > 其他分享> > 优先级反转那点事

优先级反转那点事

作者:互联网

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)。虽然在功效上这两个都能互斥,但信号灯一般系统无法做优先级继承,所以会有优先级反转的隐患。

 

标签:mutex,20,反转,互斥,那点,实时操作系统,线程,优先级
来源: https://www.cnblogs.com/gibson1959/p/15482650.html