




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
嵌入式系統(tǒng)原理及應(yīng)用第9章線程間同步1信號量2互斥量3事件集45應(yīng)用實例課后作業(yè)6本章總結(jié)線程間同步概念信號量工作機制9.1信號量信號量管理方式信號量應(yīng)用方法本節(jié)小結(jié)9.1.1線程間同步概念線程間同步是指多個線程通過特定的機制來控制多個線程的執(zhí)行順序,線程間同步方式有信號量(semaphore)、互斥量(mutex)、和事件集(event),其核心思想是:在訪問臨界區(qū)的時候只允許一個(或一類)線程運行。9.1.1線程間同步概念電機1控制線程電機2控制線程電機1控制線程電機2控制線程正轉(zhuǎn)30圈反轉(zhuǎn)10圈反轉(zhuǎn)20圈正轉(zhuǎn)10圈9.1.2信號量工作機制信號量是一種輕型的用于解決線程間同步問題的內(nèi)核對象。信號量工作示意圖如圖所示,信號量控制塊是操作系統(tǒng)用于管理信號量的一個數(shù)據(jù)結(jié)構(gòu),用結(jié)構(gòu)體structrt_semaphore表示,指向信號量控制塊的指針稱為信號量句柄,用rt_sem_t表示。./rt-thread/include/rtdef.hstructrt_ipc_object{structrt_objectparent;/*繼承自rt_object*/rt_list_tsuspend_thread;/*等待線程隊列*/};
structrt_semaphore{structrt_ipc_objectparent;/*繼承自ipc_object類*/rt_uint16_tvalue;/*信號值*/rt_uint16_treserved;/*保留*/};typedefstructrt_semaphore*rt_sem_t;9.1.2信號量工作機制rt_semaphore結(jié)構(gòu)體繼承自rt_ipc_object,每個信號量都有一個信號值和一個線程等待隊列,信號值最大為65535。./rt-thread/include/rtdef.hstructrt_ipc_object{structrt_objectparent;/*繼承自rt_object*/rt_list_tsuspend_thread;/*等待線程隊列*/};
structrt_semaphore{structrt_ipc_objectparent;/*繼承自ipc_object類*/rt_uint16_tvalue;/*信號值*/rt_uint16_treserved;/*保留*/};typedefstructrt_semaphore*rt_sem_t;9.1.2信號量工作機制線程可以獲取和釋放信號量,每成功獲取一次信號量,信號值減1,每成功釋放一次信號量,信號值加1。線程在獲取信號量時,首先被添加至線程等待鏈表,當輪到其獲取信號量時,如果信號值大于0,線程可以直接獲取到信號量,如果信號值為0,則該線程無法獲取到信號量,其狀態(tài)由運行狀態(tài)轉(zhuǎn)換為掛起狀態(tài),直到有其它線程釋放信號量,信號值大于0時,該線程才能獲取到信號量,由掛起狀態(tài)轉(zhuǎn)換為就緒狀態(tài)。以生活中的停車場為例來解釋信號量的工作機制:假設(shè)停車場有10個停車位,但有3個停車位都是空的,其余7個車位均被占用。如果此時駛來5輛車,則5輛車需排隊進入停車場,其中前3輛車可以依次駛?cè)胪\噲?,占?個停車位,這時10個停車位均被占用,因此后面的2輛車需繼續(xù)排隊等待,后續(xù)再駛來的車也須跟著排隊等待,不允許駛?cè)胪\噲?。直到停車場?nèi)有車駛出,空出停車位,等待的車才允許駛?cè)胪\噲?,并占用該空車位?.1.2信號量工作機制以生活中的停車場為例來解釋信號量的工作機制:該例子中,空車位表示信號值,駛來的車表示線程,車駛?cè)胪\噲霾⒄加每胀\囄槐硎揪€程獲取信號量,空位減1,信號值減1,當空位為0時,后續(xù)的車要在停車場外等待,即線程掛起。當有車輛駛出停車場,表示線程釋放信號量,空車位加1,信號值加1,此時存在空車位,等待的車可以駛?cè)胪\噲?,掛起線程轉(zhuǎn)換為就緒狀態(tài),在獲得CPU使用權(quán)后進入運行狀態(tài),獲取信號量,即占用該空車位,信號值再減1,如此循環(huán)。9.1.2信號量工作機制9.1.3信號量管理方式信號量根據(jù)內(nèi)存管理方式不同,分為靜態(tài)信號量和動態(tài)信號量,無論靜態(tài)信號量還是動態(tài)信號量,都是通過信號量控制塊進行管理的,相關(guān)函數(shù)在./rt-thread/src/ipc.c文件中實現(xiàn),9.1.3信號量管理方式1.創(chuàng)建和刪除信號量名稱創(chuàng)建信號量函數(shù)原型rt_sem_trt_sem_create(constchar*name,rt_uint32_tvalue,rt_uint8_tflag)參數(shù)1name:信號量名稱參數(shù)2value:信號量初始值參數(shù)3flag:信號量標志,可取RT_IPC_FLAG_FIFO或RT_IPC_FLAG_PRIO返回值成功返回信號量句柄,失敗返回RT_NULL名稱刪除信號量函數(shù)原型rt_err_trt_sem_delete(rt_sem_tsem)參數(shù)sem:信號量句柄返回值成功返回RT_EOK9.1.3信號量管理方式2.獲取和釋放信號量名稱獲取信號量函數(shù)原型rt_err_trt_sem_take(rt_sem_tsem,rt_int32_ttime)參數(shù)1sem:信號量句柄參數(shù)2time:線程等待時間,單位為系統(tǒng)節(jié)拍,可填具體數(shù)值或RT_WAITING_FOREVER(永久等待)返回值成功獲取信號量返回RT_EOK,超時未獲得信號量返回-RT_ETIMEOUT,其它錯誤返回-RT_ERROR名稱釋放信號量函數(shù)原型rt_err_trt_sem_release(rt_sem_tsem)參數(shù)sem:信號量句柄返回值成功返回RT_EOK9.1.4信號量應(yīng)用方法信號量的應(yīng)用有固定的步驟,以動態(tài)信號量為例,包括如下4個步驟:(1)定義信號量句柄:rt_sem_tdsem=RT_NULL;(2)主線程創(chuàng)建信號量:dsem=rt_sem_create("dsem",0,RT_IPC_FLAG_FIFO);(3)線程1#X釋放信號量:rt_sem_release(dsem);(4)線程2#Y獲取信號量:rt_sem_take(dsem,RT_WAITING_FOREVER);9.1.4信號量應(yīng)用方法注意:信號量句柄為全局變量。信號量要在線程啟動前創(chuàng)建。兩線程同步時,信號量初始值為0本節(jié)小結(jié)理解信號量的概念和工作機制;掌握信號量應(yīng)用方法?;コ饬扛拍罨コ饬抗ぷ鳈C制9.2互斥量互斥量管理方式互斥量應(yīng)用方法本節(jié)小結(jié)9.2.1互斥量概念互斥量又叫相互排斥的信號量,是一種特殊的二值信號量。互斥量類似于只有一個車位的停車場:當有一輛車進入的時候,將停車場大門鎖住,其他車輛在外面等候。當里面的車出來時,將停車場大門打開,下一輛車才可以進入。9.2.2互斥量工作機制互斥量的狀態(tài)只有兩種:0和1。線程可以獲取和釋放互斥量,線程成功獲取互斥量后,該線程擁有互斥量的所有權(quán),稱為持有線程,某一個時刻一個互斥量只能被一個線程持有?;コ饬恐荒苡沙钟芯€程釋放互斥量,其它線程無權(quán)釋放互斥量。./rt-thread/include/rtdef.hstructrt_mutex{structrt_ipc_objectparent;/*繼承自ipc_object*/rt_uint16_tvalue;/*互斥量的值*/rt_uint8_toriginal_priority;/*持有線程的原始優(yōu)先級*/rt_uint8_thold;/*持有線程的持有次數(shù)*/structrt_thread*owner;/*當前持有互斥量的線程*/};9.2.2互斥量工作機制互斥量的狀態(tài)只有兩種:0和1。當互斥量被某線程持有后,其它線程在獲取互斥量時會因獲取不到而被掛起,直到持有線程釋放了互斥量,持有線程一旦釋放互斥量,便失去互斥量的所有權(quán),其它線程獲取到互斥量,成為新的持有線程,其狀態(tài)由掛起狀態(tài)轉(zhuǎn)換為就緒狀態(tài)。./rt-thread/include/rtdef.hstructrt_mutex{structrt_ipc_objectparent;/*繼承自ipc_object*/rt_uint16_tvalue;/*互斥量的值*/rt_uint8_toriginal_priority;/*持有線程的原始優(yōu)先級*/rt_uint8_thold;/*持有線程的持有次數(shù)*/structrt_thread*owner;/*當前持有互斥量的線程*/};9.2.2互斥量工作機制互斥量的狀態(tài)只有兩種:0和1。持有線程可以多次獲取互斥量,而不會被掛起,持有線程獲取互斥量后要及時釋放互斥量,以便其它線程能夠獲取到互斥量,需要注意的是持有線程獲取幾次,便應(yīng)該釋放幾次。./rt-thread/include/rtdef.hstructrt_mutex{structrt_ipc_objectparent;/*繼承自ipc_object*/rt_uint16_tvalue;/*互斥量的值*/rt_uint8_toriginal_priority;/*持有線程的原始優(yōu)先級*/rt_uint8_thold;/*持有線程的持有次數(shù)*/structrt_thread*owner;/*當前持有互斥量的線程*/};9.2.2互斥量工作機制互斥量和信號量的不同點:互斥量:線程擁有互斥量的所有權(quán),只能由持有線程釋放;支持遞歸訪問;能防止線程優(yōu)先級翻轉(zhuǎn)。信號量:線程不具有信號量的所有權(quán),可以由任何線程釋放;線程遞歸持有會形成死鎖;可能發(fā)生線程優(yōu)先級翻轉(zhuǎn)。./rt-thread/include/rtdef.hstructrt_mutex{structrt_ipc_objectparent;/*繼承自ipc_object*/rt_uint16_tvalue;/*互斥量的值*/rt_uint8_toriginal_priority;/*持有線程的原始優(yōu)先級*/rt_uint8_thold;/*持有線程的持有次數(shù)*/structrt_thread*owner;/*當前持有互斥量的線程*/};9.2.2互斥量工作機制優(yōu)先級翻轉(zhuǎn):當高優(yōu)先級線程A通過信號量訪問共享資源時,如果該信號量已被低優(yōu)先級線程C持有,而線程C運行時被中等優(yōu)先級線程B搶占,造成高優(yōu)先級線程C被較低優(yōu)先級線程阻塞,實時性難以得到保證。9.2.2互斥量工作機制9.2.2互斥量工作機制互斥量可以通過優(yōu)先級繼承算法解決優(yōu)先級翻轉(zhuǎn)問題。優(yōu)先級繼承:暫時提高低優(yōu)先級線程C的優(yōu)先級至高優(yōu)先級線程A的優(yōu)先級,避免線程C被中等優(yōu)先級線程B搶占,當?shù)蛢?yōu)先級線程C釋放資源時,再將其優(yōu)先級復(fù)原。注意:獲得互斥量后,請盡快釋放互斥量,并且在持有互斥量的過程中,不得再行更改持有互斥量線程的優(yōu)先級。9.2.2互斥量工作機制9.2.3互斥量管理方式9.2.4互斥量應(yīng)用方法互斥量的應(yīng)用有固定的步驟,以動態(tài)互斥量為例,包括如下4個步驟:(1)定義互斥量句柄:rt_mutex_tdmutex=RT_NULL;(2)主線程創(chuàng)建互斥量:dmutex=rt_mutex_create("dmutex",0,RT_IPC_FLAG_FIFO);(3)線程獲取互斥量:rt_mutex_release(dmutex);(4)持有線程釋放互斥量:rt_mutex_take(dmutex,RT_WAITING_FOREVER);9.2.4互斥量應(yīng)用方法注意:互斥量句柄為全局變量?;コ饬恳诰€程啟動前創(chuàng)建。誰持有誰釋放,盡快釋放。本節(jié)小結(jié)理解互斥量的概念和工作機制;掌握互斥量應(yīng)用方法。事件集概念事件集工作機制9.3事件集事件集管理方式事件集應(yīng)用方法本節(jié)小結(jié)9.3.1事件集概念事件集是多個事件的集合,用與實現(xiàn)一對多,多對多的同步。以坐公交為例,在公交站等公交時可能有以下幾種情況:(1)P1坐公交去某地(線程),只有一種公交可以到達目的地,等到此公交即可出發(fā)(特定事件喚醒線程);(2)P1坐公交去某地,有3種公交都可以到達目的地,等到其中任意一輛即可出發(fā)(任意單個事件喚醒線程);(3)P1約另一人P2一起去某地,則P1必須要等“P2到達公交站”與“公交到達公交站”(事件)兩個條件都滿足后,才能出發(fā)(多個事件同時發(fā)生才喚醒線程)。9.3.2事件集工作機制事件集控制塊是操作系統(tǒng)用于管理事件集的一個數(shù)據(jù)結(jié)構(gòu),用結(jié)構(gòu)體structrt_event表示,指向事件集控制塊的指針稱為事件集句柄,用rt_event_t表示。./rt-thread/include/rtdef.hstructrt_event{structrt_ipc_objectparent;/*繼承自ipc_object*/rt_uint32_tset;/*事件集*/};typedefstructrt_event*rt_event_t;9.3.2事件集工作機制每個線程都擁有一個事件信息標記,它有三個屬性:RT_EVENT_FLAG_AND(邏輯與),RT_EVENT_FLAG_OR(邏輯或)和RT_EVENT_FLAG_CLEAR(清除標記)。9.3.3事件集管理方式9.3.3事件集管理方式1.發(fā)送事件名稱發(fā)送事件函數(shù)原型rt_err_trt_event_send(rt_event_tevent,rt_uint32_tset)參數(shù)1event:事件集句柄參數(shù)2set:發(fā)送一個或多個事件的標志值返回值成功返回RT_EOK9.3.3事件集管理方式2.接收事件名稱接收事件函數(shù)原型rt_err_trt_event_recv(rt_event_tevent,rt_uint32_tset,rt_uint8_toption,rt_int32_ttimeout,rt_uint32_t*recved)參數(shù)1event:事件集句柄參數(shù)2set:接收線程感興趣的事件參數(shù)3option:接收選項RT_EVENT_FLAG_OR/RT_EVENT_FLAG_AND|RT_EVENT_FLAG_CLEAR參數(shù)4timeout:超時時間參數(shù)5recved:指向接收的事件返回值成功返回RT_EOK,超時返回-RT_ETIMEOUT,其它錯誤返回-RT_ERROR9.3.4事件集應(yīng)用方法事件集的應(yīng)用有固定的步驟,以動態(tài)事件集為例,包括如下5個步驟:(1)宏定義事件:#defineE1(1<<1)
#defineE2(1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)療系統(tǒng)技術(shù)服務(wù)合同
- 木工承包協(xié)議合同
- 個人擔保貸款合同樣本
- 智能機器人開發(fā)生產(chǎn)合同
- 濰坊護理職業(yè)學院《教師職業(yè)道德與職業(yè)規(guī)范(含教育政策與法規(guī))》2023-2024學年第二學期期末試卷
- 江南影視藝術(shù)職業(yè)學院《微生物資源與應(yīng)用》2023-2024學年第二學期期末試卷
- 甘肅機電職業(yè)技術(shù)學院《國家公園與地質(zhì)公園概論》2023-2024學年第二學期期末試卷
- 9獵人海力布 教學設(shè)計-2024-2025學年五年級上冊語文統(tǒng)編版
- 鄭州電子商務(wù)職業(yè)學院《體育游戲組織與編創(chuàng)》2023-2024學年第二學期期末試卷
- 皖南醫(yī)學院《軟件項目》2023-2024學年第二學期期末試卷
- 一年級下期開學第一課
- 舞臺燈光設(shè)計與光影藝術(shù)考核試卷
- 第10輯:句子表達效果(原句vs改句)解題指導(dǎo)-2023年高考語文一輪復(fù)習修辭手法與句子表達效果專練
- 2024年輔警招考時事政治考題及答案(100題)
- 2024年中考數(shù)學《二次函數(shù)的實際應(yīng)用》真題含解析版
- GB 30254-2024高壓三相籠型異步電動機能效限定值及能效等級
- 非物質(zhì)文化遺產(chǎn)拓印 課件
- 空氣動力學數(shù)值方法:有限元法(FEM):邊界條件處理與應(yīng)用
- 教科版科學三年級下冊《 各種各樣的運動 》課件
- 部編版八年級物理(上冊)期末試卷(帶答案)
- NB-T10342-2019水電站調(diào)節(jié)保證設(shè)計導(dǎo)則
評論
0/150
提交評論