关于mutex,priority的问题

single cpu,multi-threads,
如果一个thread获得mutex,是不是说即使很多已经处于ready的thread优先级高于它,这个thread也要运行直至结束,才放出mutex,这时其他的threads再根据优先级获得mutex(同级的靠rr或fifo)。
谢谢指教

thread A 在优先级 10 上获得了mutex,然后 thread B 在优先级 20 上要求同一个mutex,thread B会被阻塞,直到 thread A放弃mutex为止。这是正确的,因为使用mutex 的原因就是为了防止不同的thread同时进入被保护的程序。

但是考虑这样的情况,如果在thread A放弃mutex之前,另有一个thread C,在优先级 15 上占用CPU的话,thread A会因为无法获得CPU而不能放弃mutex,从而导致thread B被长时间阻塞。从现象上,就是低优先级的thread C (15)阻塞了高优先级的 thread B (20), 这在RTOS里叫做“优先级倒置”,是影响实时性的大敌。

为了防止优先级倒置,当thread B (20) 请求mutex并被阻塞时,QNX的内核会自动把thread A的优先级提升到20。thread A 会在 20 上一直运行到它放弃mutex 为止,然后它才会回来它原来的优先级10上去。这样,在thread A放弃mutex之前,任何比20低的线程都没有机会占用CPU,从而防止了优先级倒置。

很感谢唐先生的指点,我现在对这个概念很清楚了
不过有一句还是不太懂呀,
“如果在thread A放弃mutex之前,另有一个thread C,在优先级 15 上占用CPU的话,thread A会因为无法获得CPU而不能放弃mutex,从而导致thread B被长时间阻塞”
既然A已经获得了mutex,即使有C,C也不能占用cpu呀,毕竟是单cpu呀,我理解的错误在哪里呢

麻烦您了

我理解唐先生所说的thread c并没有通过mutex来和thread a抢夺优先权,所以它不受thread a的阻塞

我有些明白了,(可能还要消化一下),谢谢qnxmaster大侠的指点

QNX Master说的对,thread C并不要获得Mutex,只是在15上运行。因为它优先级比10高,系统会一直让它运行,除非它自已放弃CPU。

谢谢你们得详解,我现在应该是明白这个概念了,是不是这样呀
single cpu 中,
一个程序中开线程的时候必须有
pthread_mutex _lock (&mutex)

pthread_mutex_unlock(&)
这个线程才会进入竞争mutex的状态,
否则它就按自己的优先级运行,
也就是说,A有mutex,已经运行,prio是10
15级的B当ready时,并不去要mutex,那么cpu就要中断A,让B运行
C即使是20,但它被设定成要争mutex,所以才要等待

从而有可能造成xtang先生所说的优先级倒置

虽然差不多是重复了,但是是俺的感受,希望能帮助和我一样的beginner理解

如不麻烦,希望二位大侠帮我顶一下那三个悬着的问题

qnxmaster开过一贴讲过有A/D卡的使用经验,能针对我的情况给点建议吗

对,你的理解是正确的。

另外,上面讨论的优先级倒置的情况,并不一定是单CPU才会发生。如果操作系统没有处理好,即使多个CPU,也同样会倒置。(只要在15上运行的线徎多几个就会了)

再有一个就是,并不是所有多线程的程序都要pthread_mutex_lock()/unlock()的,只是当你的程序需要保护时才会用到mutex。如果可能的话,你应该尽可能使你的程序少用mutex,这样将来使用多处理器时,就可以看到很好的效率增长。