ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

优先级反转那点事

2021-10-29 20:36:47  阅读:251  来源: 互联网

标签:mutex 20 反转 互斥 那点 实时操作系统 线程 优先级


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有