您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關RT-Thread線程間通信學習過程是怎樣的,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
下面總結關于RT-Thread多線程相關的最后一個重要知識點:線程間通信。前面的文章多次提及到,一個大的任務拆分為多個小任務,這些小任務之間必然存在著各種各樣的關系,導致這些小任務的線程不能各自為政,必須要考慮其他任務線程的運行情況。
既然已經有了線程間同步,可以讓多個線程之間進行相互溝通,那為啥還需要線程間通信呢?線程間通信到底是什么東西,這種方式有什么應用場景?小編嘗試從以下幾個方面總結一下RT-Thread線程間通信的學習過程
線程間通信的相關概念
什么是線程間通信?通信,顧名思義,就是雙方需要進行溝通與對話。通俗地概括,就是A線程在工作運行期間,有某些數據或者信息,要告訴B線程,讓B線程接收到這些數據或信息后,能夠繼續完成指定的任務和工作。
兩個線程之間為什么要進行通信呢?還是那句話,多個任務線程并不是獨立的,它們在工作的時候是需要根據業務場景進行一定的溝通的,還是以音樂播放器舉例,當歌詞讀取線程把歌詞從硬盤里面讀出來了,要把這一串讀到的歌詞告訴給顯示線程,讓它把歌詞顯示出來。這個“告訴”的動作,就是通過線程間通信來進行的。
2.png
既然都是為了協調線程的工作狀態,線程間同步和線程間通信這兩者有什么區別呢?區別就是線程間同步能做的事情太有限了,線程間同步只是告訴一下對方“別跑太快,等等我嘛~”,而線程間通信,就是有一大堆的數據和信息要告知對方,萬一A線程有很多話要跟B線程說,線程同步這種方式就不能滿足要求了,所以需要線程間通信。
郵箱在使用過程中,可能會存在郵箱空或郵箱滿的情況,在郵箱空的情況下,接收郵件的線程會選擇掛起等待,或者等超時時間到來。在郵箱滿的情況下,發送郵件的線程會選擇掛起或直接返回一個郵箱滿的返回值。
系統內核提供以下郵箱相關的API函數接口,如下圖所示。
當線程A要發送一個消息時,先從空閑消息塊鏈表取出一個塊空間,把消息裝進去后,把這個消息塊掛接到非空消息塊鏈表的隊尾。如果使用緊急方式發送消息,則把該消息塊掛接到非空消息鏈表的隊首。線程獲取消息的時候,總是會獲取鏈表頭的消息的。
系統內核提供以下消息隊列相關的API函數接口,如下圖所示。
系統內核提供以下信號相關的API函數接口,如下圖所示。
線程間通信的注意事項
在進行多線程間通信的時候,關于郵箱、消息隊列、信號這三種線程間通信方式,有以下一些注意事項:
1.使用郵箱進行線程間通信時,由于一封郵件最多只能是4個字節長度,因此如果要傳遞較多數據信息,可以使用結構體進行信息封裝,通過指針方式進行傳遞。
2.郵件發送是非阻塞的,因此可以應用于中斷服務程序中。但郵件接收是阻塞的,可以設置接收超時的時間,不能在中斷服務程序里面使用郵件接收。
3.當郵箱沒有郵件且超時時間不為0 ,郵件的接收過程自動變為阻塞方式。當郵箱滿了后,發送線程可以選擇掛起等待或直接返回郵箱滿的錯誤碼。
4.消息隊列是一種異步的通信方式,消息隊列里面的消息總是遵循先進先出的原則。
5.可以在線程或中斷服務程序里面可以給消息隊列發送消息,但不能在中斷服務程序里面接收消息。
6.可以往消息隊列里面發送緊急消息,緊急消息會被放置到消息隊列的鏈表頭,會首先被等待的線程獲取。
7.信號跟信號量不同,不能混淆兩者的概念,信號是軟件層面上的一種軟中斷方式。
8.線程不會用阻塞的方式等待信號的到來,因為線程自身也不知道這個信號(軟中斷)什么時候會到。
9.線程對信號的處理,可以設置為捕捉信號,忽略信號,使用默認方式處理信號。
看完上述內容,你們對RT-Thread線程間通信學習過程是怎樣的有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。