rtthread学习-防止优先级翻转
學習視頻網址:
RT-Thread內核入門指南-線程的優先級翻轉問題
學習記錄。
第一次學這門課的時候,是覺得有點迷糊
課上講了ABC三個優先級的線程,A是需要使用C中的互斥量,而互斥量在C中鎖住了,所以A被掛起了,只有C釋放了mutex后A才能就緒,才能被任務調度器調度。在等待過程中,B線程就緒了,而B線程的優先級比C高,按道理,此時B應該需要先運行,運行完成之后才能運行C,C釋放了mutex之后A才能運行,此時就出現了個問題,明明A的優先級比B高,卻是B比A先運行。這就是優先級翻轉。
【整理】什么是優先級反轉+有何危害+如何避免和解決
這篇文章講的很好,然后我就了解了什么是優先級翻轉。
為了阻止這種事情的發生,互斥鎖里面有一種機制,可以繼承上一級的優先級,按照上述例子,即C可以繼承A的優先級
下面是互斥鎖的結構體定義,主要是通過指針owner和變量 original_priority實現的
如何繼承的呢? 在ipc.c中的731行開始
/* change the owner thread priority of mutex */if (thread->current_priority < mutex->owner->current_priority){/* change the owner thread priority */rt_thread_control(mutex->owner,RT_THREAD_CTRL_CHANGE_PRIORITY,&thread->current_priority);}thread是當前的thread,即當線程A執行到這里的時候,這個thread->thread-A
mutex->owner 是thread-C,因為C還沒處理完
通過rt_thread_control這個函數,實現了把A的優先級賦值給了C
所以當B就緒的時候,因為C的優先級提高了,所以任務調度器會先執行C,再執行A,最后再執行B,防止先B后A導致優先級翻轉。
rt_thread_control這個函數也挺有意思,他會把舊的低優先級的C從任務隊列里面丟掉,給C賦予新的優先級后再把它插入任務隊列里面,具體可以進去看一看,原來RT-Thread里面是這樣干的。
注意if (thread->current_priority < mutex->owner->current_priority)之所以成成立,是因為A的優先級比C高 ,值越小優先級越高,剛好反過來的。所以A優先級的值比C小,所以能成立。
講完了這個視頻課程里面的例子,知道了什么是優先級翻轉之后,視頻課程里面對應的代碼如果是第一次看的話會讓人感覺疑惑。
代碼的設計是這樣的 ,設計了也是ABC三個線程,A線程優先級最高,依次遞減。
代碼里面是想通過B-C直接的互動來演示防止出現優先級翻轉的情況,而A只是作為一個監視者,因為A優先級最高可以一直打印他們的優先級。不用過于糾結A線程,重點是需要看BC之間的互動。
但是因為剛開始課件里面的例子也是ABC,所以很容易讓人混淆。
其實最好應該是在BC之間再添加一個X線程,BXC線程對應課件例子的ABC線程,這樣就不容易讓初學者產生誤解了。
總結
以上是生活随笔為你收集整理的rtthread学习-防止优先级翻转的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UG模具设计部分
- 下一篇: 正则匹配中文添加引号,正则使用变量