日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

rtthread学习-防止优先级翻转

發布時間:2024/3/26 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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實現的

/*** Mutual exclusion (mutex) structure*/ struct rt_mutex {struct rt_ipc_object parent; /**< inherit from ipc_object */rt_uint16_t value; /**< value of mutex */rt_uint8_t original_priority; /**< priority of last thread hold the mutex */rt_uint8_t hold; /**< numbers of thread hold the mutex */struct rt_thread *owner; /**< current owner of mutex */ };

如何繼承的呢? 在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学习-防止优先级翻转的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。