【系统编程】信号量和互斥量、优先级反转
信号量
这里贴出一篇很好的文章
https://blog.csdn.net/weixin_43914272/article/details/108317212
信号量有二值、计数、整型
二值的话相当于一个互斥量了,只有0和1两种状态,线程要么获得资源然后运行后释放,要么阻塞等待,直到信号量被释放
信号量还有一个突出特点,那就是它的值可以为负,当为负数的时候,说明当前资源有多个进程在排队等待
应用:
二值信号量作为互斥量来使用
计数信号量的案例的话,可以参考线程池?(连个客户端,就分配一个线程,线程分配完了就不能分配了,阻塞住)
互斥量
互斥量又名互斥锁,对于临界资源访问的保护
优先级反转问题
三个线程,优先级A>B>C,C最先获取同步资源P,然后B进入,抢占了C,接着A进入,而A是需要获取P的,然而此时P还在C手上没被释放,需要等到B运行结束,运行到C后释放了P,A才有机会运行,这就出现了优先级反转
解决办法:
(1)优先级继承
在上面的问题中,当A进入的时候,判断A和C的优先级情况和对P的需求,从而把C拉到和A一样的优先级,这时C就可以抢占B的运行从而得到调度,从而快速运行结束释放P,从而让A得到运行
(2)优先级天花板
直接把C的优先级拉满,也就是当线程申请某共享资源时,把该线程的优先级提升到可访问这个资源的所有线程中的最高优先级,这个优先级称为该资源的优先级天花板。
浙公网安备 33010602011771号