溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

RT-Thread線程間通信學(xué)習(xí)過程是怎樣的

發(fā)布時間:2021-12-17 15:44:38 來源:億速云 閱讀:177 作者:柒染 欄目:互聯(lián)網(wǎng)科技

今天就跟大家聊聊有關(guān)RT-Thread線程間通信學(xué)習(xí)過程是怎樣的,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

下面總結(jié)關(guān)于RT-Thread多線程相關(guān)的最后一個重要知識點(diǎn):線程間通信。前面的文章多次提及到,一個大的任務(wù)拆分為多個小任務(wù),這些小任務(wù)之間必然存在著各種各樣的關(guān)系,導(dǎo)致這些小任務(wù)的線程不能各自為政,必須要考慮其他任務(wù)線程的運(yùn)行情況。

既然已經(jīng)有了線程間同步,可以讓多個線程之間進(jìn)行相互溝通,那為啥還需要線程間通信呢?線程間通信到底是什么東西,這種方式有什么應(yīng)用場景?小編嘗試從以下幾個方面總結(jié)一下RT-Thread線程間通信的學(xué)習(xí)過程

RT-Thread線程間通信學(xué)習(xí)過程是怎樣的
線程間通信的相關(guān)概念

什么是線程間通信?通信,顧名思義,就是雙方需要進(jìn)行溝通與對話。通俗地概括,就是A線程在工作運(yùn)行期間,有某些數(shù)據(jù)或者信息,要告訴B線程,讓B線程接收到這些數(shù)據(jù)或信息后,能夠繼續(xù)完成指定的任務(wù)和工作。

兩個線程之間為什么要進(jìn)行通信呢?還是那句話,多個任務(wù)線程并不是獨(dú)立的,它們在工作的時候是需要根據(jù)業(yè)務(wù)場景進(jìn)行一定的溝通的,還是以音樂播放器舉例,當(dāng)歌詞讀取線程把歌詞從硬盤里面讀出來了,要把這一串讀到的歌詞告訴給顯示線程,讓它把歌詞顯示出來。這個“告訴”的動作,就是通過線程間通信來進(jìn)行的。
2.png
既然都是為了協(xié)調(diào)線程的工作狀態(tài),線程間同步和線程間通信這兩者有什么區(qū)別呢?區(qū)別就是線程間同步能做的事情太有限了,線程間同步只是告訴一下對方“別跑太快,等等我嘛~”,而線程間通信,就是有一大堆的數(shù)據(jù)和信息要告知對方,萬一A線程有很多話要跟B線程說,線程同步這種方式就不能滿足要求了,所以需要線程間通信。
RT-Thread線程間通信學(xué)習(xí)過程是怎樣的

郵箱在使用過程中,可能會存在郵箱空或郵箱滿的情況,在郵箱空的情況下,接收郵件的線程會選擇掛起等待,或者等超時時間到來。在郵箱滿的情況下,發(fā)送郵件的線程會選擇掛起或直接返回一個郵箱滿的返回值。

系統(tǒng)內(nèi)核提供以下郵箱相關(guān)的API函數(shù)接口,如下圖所示。
RT-Thread線程間通信學(xué)習(xí)過程是怎樣的

當(dāng)線程A要發(fā)送一個消息時,先從空閑消息塊鏈表取出一個塊空間,把消息裝進(jìn)去后,把這個消息塊掛接到非空消息塊鏈表的隊(duì)尾。如果使用緊急方式發(fā)送消息,則把該消息塊掛接到非空消息鏈表的隊(duì)首。線程獲取消息的時候,總是會獲取鏈表頭的消息的。

系統(tǒng)內(nèi)核提供以下消息隊(duì)列相關(guān)的API函數(shù)接口,如下圖所示。
RT-Thread線程間通信學(xué)習(xí)過程是怎樣的

系統(tǒng)內(nèi)核提供以下信號相關(guān)的API函數(shù)接口,如下圖所示。
RT-Thread線程間通信學(xué)習(xí)過程是怎樣的
線程間通信的注意事項(xiàng)

在進(jìn)行多線程間通信的時候,關(guān)于郵箱、消息隊(duì)列、信號這三種線程間通信方式,有以下一些注意事項(xiàng):

1.使用郵箱進(jìn)行線程間通信時,由于一封郵件最多只能是4個字節(jié)長度,因此如果要傳遞較多數(shù)據(jù)信息,可以使用結(jié)構(gòu)體進(jìn)行信息封裝,通過指針方式進(jìn)行傳遞。

2.郵件發(fā)送是非阻塞的,因此可以應(yīng)用于中斷服務(wù)程序中。但郵件接收是阻塞的,可以設(shè)置接收超時的時間,不能在中斷服務(wù)程序里面使用郵件接收。

3.當(dāng)郵箱沒有郵件且超時時間不為0 ,郵件的接收過程自動變?yōu)樽枞绞?。?dāng)郵箱滿了后,發(fā)送線程可以選擇掛起等待或直接返回郵箱滿的錯誤碼。

4.消息隊(duì)列是一種異步的通信方式,消息隊(duì)列里面的消息總是遵循先進(jìn)先出的原則。

5.可以在線程或中斷服務(wù)程序里面可以給消息隊(duì)列發(fā)送消息,但不能在中斷服務(wù)程序里面接收消息。

6.可以往消息隊(duì)列里面發(fā)送緊急消息,緊急消息會被放置到消息隊(duì)列的鏈表頭,會首先被等待的線程獲取。

7.信號跟信號量不同,不能混淆兩者的概念,信號是軟件層面上的一種軟中斷方式。

8.線程不會用阻塞的方式等待信號的到來,因?yàn)榫€程自身也不知道這個信號(軟中斷)什么時候會到。

9.線程對信號的處理,可以設(shè)置為捕捉信號,忽略信號,使用默認(rèn)方式處理信號。

看完上述內(nèi)容,你們對RT-Thread線程間通信學(xué)習(xí)過程是怎樣的有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI