第9章 線程間同步_第1頁(yè)
第9章 線程間同步_第2頁(yè)
第9章 線程間同步_第3頁(yè)
第9章 線程間同步_第4頁(yè)
第9章 線程間同步_第5頁(yè)
已閱讀5頁(yè),還剩44頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

嵌入式系統(tǒng)原理及應(yīng)用第9章線程間同步1信號(hào)量2互斥量3事件集45應(yīng)用實(shí)例課后作業(yè)6本章總結(jié)線程間同步概念信號(hào)量工作機(jī)制9.1信號(hào)量信號(hào)量管理方式信號(hào)量應(yīng)用方法本節(jié)小結(jié)9.1.1線程間同步概念線程間同步是指多個(gè)線程通過(guò)特定的機(jī)制來(lái)控制多個(gè)線程的執(zhí)行順序,線程間同步方式有信號(hào)量(semaphore)、互斥量(mutex)、和事件集(event),其核心思想是:在訪問(wèn)臨界區(qū)的時(shí)候只允許一個(gè)(或一類)線程運(yùn)行。9.1.1線程間同步概念電機(jī)1控制線程電機(jī)2控制線程電機(jī)1控制線程電機(jī)2控制線程正轉(zhuǎn)30圈反轉(zhuǎn)10圈反轉(zhuǎn)20圈正轉(zhuǎn)10圈9.1.2信號(hào)量工作機(jī)制信號(hào)量是一種輕型的用于解決線程間同步問(wèn)題的內(nèi)核對(duì)象。信號(hào)量工作示意圖如圖所示,信號(hào)量控制塊是操作系統(tǒng)用于管理信號(hào)量的一個(gè)數(shù)據(jù)結(jié)構(gòu),用結(jié)構(gòu)體structrt_semaphore表示,指向信號(hào)量控制塊的指針稱為信號(hào)量句柄,用rt_sem_t表示。./rt-thread/include/rtdef.hstructrt_ipc_object{structrt_objectparent;/*繼承自rt_object*/rt_list_tsuspend_thread;/*等待線程隊(duì)列*/};

structrt_semaphore{structrt_ipc_objectparent;/*繼承自ipc_object類*/rt_uint16_tvalue;/*信號(hào)值*/rt_uint16_treserved;/*保留*/};typedefstructrt_semaphore*rt_sem_t;9.1.2信號(hào)量工作機(jī)制rt_semaphore結(jié)構(gòu)體繼承自rt_ipc_object,每個(gè)信號(hào)量都有一個(gè)信號(hào)值和一個(gè)線程等待隊(duì)列,信號(hào)值最大為65535。./rt-thread/include/rtdef.hstructrt_ipc_object{structrt_objectparent;/*繼承自rt_object*/rt_list_tsuspend_thread;/*等待線程隊(duì)列*/};

structrt_semaphore{structrt_ipc_objectparent;/*繼承自ipc_object類*/rt_uint16_tvalue;/*信號(hào)值*/rt_uint16_treserved;/*保留*/};typedefstructrt_semaphore*rt_sem_t;9.1.2信號(hào)量工作機(jī)制線程可以獲取和釋放信號(hào)量,每成功獲取一次信號(hào)量,信號(hào)值減1,每成功釋放一次信號(hào)量,信號(hào)值加1。線程在獲取信號(hào)量時(shí),首先被添加至線程等待鏈表,當(dāng)輪到其獲取信號(hào)量時(shí),如果信號(hào)值大于0,線程可以直接獲取到信號(hào)量,如果信號(hào)值為0,則該線程無(wú)法獲取到信號(hào)量,其狀態(tài)由運(yùn)行狀態(tài)轉(zhuǎn)換為掛起狀態(tài),直到有其它線程釋放信號(hào)量,信號(hào)值大于0時(shí),該線程才能獲取到信號(hào)量,由掛起狀態(tài)轉(zhuǎn)換為就緒狀態(tài)。以生活中的停車場(chǎng)為例來(lái)解釋信號(hào)量的工作機(jī)制:假設(shè)停車場(chǎng)有10個(gè)停車位,但有3個(gè)停車位都是空的,其余7個(gè)車位均被占用。如果此時(shí)駛來(lái)5輛車,則5輛車需排隊(duì)進(jìn)入停車場(chǎng),其中前3輛車可以依次駛?cè)胪\噲?chǎng),占用3個(gè)停車位,這時(shí)10個(gè)停車位均被占用,因此后面的2輛車需繼續(xù)排隊(duì)等待,后續(xù)再駛來(lái)的車也須跟著排隊(duì)等待,不允許駛?cè)胪\噲?chǎng)。直到停車場(chǎng)內(nèi)有車駛出,空出停車位,等待的車才允許駛?cè)胪\噲?chǎng),并占用該空車位。9.1.2信號(hào)量工作機(jī)制以生活中的停車場(chǎng)為例來(lái)解釋信號(hào)量的工作機(jī)制:該例子中,空車位表示信號(hào)值,駛來(lái)的車表示線程,車駛?cè)胪\噲?chǎng)并占用空停車位表示線程獲取信號(hào)量,空位減1,信號(hào)值減1,當(dāng)空位為0時(shí),后續(xù)的車要在停車場(chǎng)外等待,即線程掛起。當(dāng)有車輛駛出停車場(chǎng),表示線程釋放信號(hào)量,空車位加1,信號(hào)值加1,此時(shí)存在空車位,等待的車可以駛?cè)胪\噲?chǎng),掛起線程轉(zhuǎn)換為就緒狀態(tài),在獲得CPU使用權(quán)后進(jìn)入運(yùn)行狀態(tài),獲取信號(hào)量,即占用該空車位,信號(hào)值再減1,如此循環(huán)。9.1.2信號(hào)量工作機(jī)制9.1.3信號(hào)量管理方式信號(hào)量根據(jù)內(nèi)存管理方式不同,分為靜態(tài)信號(hào)量和動(dòng)態(tài)信號(hào)量,無(wú)論靜態(tài)信號(hào)量還是動(dòng)態(tài)信號(hào)量,都是通過(guò)信號(hào)量控制塊進(jìn)行管理的,相關(guān)函數(shù)在./rt-thread/src/ipc.c文件中實(shí)現(xiàn),9.1.3信號(hào)量管理方式1.創(chuàng)建和刪除信號(hào)量名稱創(chuàng)建信號(hào)量函數(shù)原型rt_sem_trt_sem_create(constchar*name,rt_uint32_tvalue,rt_uint8_tflag)參數(shù)1name:信號(hào)量名稱參數(shù)2value:信號(hào)量初始值參數(shù)3flag:信號(hào)量標(biāo)志,可取RT_IPC_FLAG_FIFO或RT_IPC_FLAG_PRIO返回值成功返回信號(hào)量句柄,失敗返回RT_NULL名稱刪除信號(hào)量函數(shù)原型rt_err_trt_sem_delete(rt_sem_tsem)參數(shù)sem:信號(hào)量句柄返回值成功返回RT_EOK9.1.3信號(hào)量管理方式2.獲取和釋放信號(hào)量名稱獲取信號(hào)量函數(shù)原型rt_err_trt_sem_take(rt_sem_tsem,rt_int32_ttime)參數(shù)1sem:信號(hào)量句柄參數(shù)2time:線程等待時(shí)間,單位為系統(tǒng)節(jié)拍,可填具體數(shù)值或RT_WAITING_FOREVER(永久等待)返回值成功獲取信號(hào)量返回RT_EOK,超時(shí)未獲得信號(hào)量返回-RT_ETIMEOUT,其它錯(cuò)誤返回-RT_ERROR名稱釋放信號(hào)量函數(shù)原型rt_err_trt_sem_release(rt_sem_tsem)參數(shù)sem:信號(hào)量句柄返回值成功返回RT_EOK9.1.4信號(hào)量應(yīng)用方法信號(hào)量的應(yīng)用有固定的步驟,以動(dòng)態(tài)信號(hào)量為例,包括如下4個(gè)步驟:(1)定義信號(hào)量句柄:rt_sem_tdsem=RT_NULL;(2)主線程創(chuàng)建信號(hào)量:dsem=rt_sem_create("dsem",0,RT_IPC_FLAG_FIFO);(3)線程1#X釋放信號(hào)量:rt_sem_release(dsem);(4)線程2#Y獲取信號(hào)量:rt_sem_take(dsem,RT_WAITING_FOREVER);9.1.4信號(hào)量應(yīng)用方法注意:信號(hào)量句柄為全局變量。信號(hào)量要在線程啟動(dòng)前創(chuàng)建。兩線程同步時(shí),信號(hào)量初始值為0本節(jié)小結(jié)理解信號(hào)量的概念和工作機(jī)制;掌握信號(hào)量應(yīng)用方法?;コ饬扛拍罨コ饬抗ぷ鳈C(jī)制9.2互斥量互斥量管理方式互斥量應(yīng)用方法本節(jié)小結(jié)9.2.1互斥量概念互斥量又叫相互排斥的信號(hào)量,是一種特殊的二值信號(hào)量。互斥量類似于只有一個(gè)車位的停車場(chǎng):當(dāng)有一輛車進(jìn)入的時(shí)候,將停車場(chǎng)大門鎖住,其他車輛在外面等候。當(dāng)里面的車出來(lái)時(shí),將停車場(chǎng)大門打開,下一輛車才可以進(jìn)入。9.2.2互斥量工作機(jī)制互斥量的狀態(tài)只有兩種:0和1。線程可以獲取和釋放互斥量,線程成功獲取互斥量后,該線程擁有互斥量的所有權(quán),稱為持有線程,某一個(gè)時(shí)刻一個(gè)互斥量只能被一個(gè)線程持有。互斥量只能由持有線程釋放互斥量,其它線程無(wú)權(quán)釋放互斥量。./rt-thread/include/rtdef.hstructrt_mutex{structrt_ipc_objectparent;/*繼承自ipc_object*/rt_uint16_tvalue;/*互斥量的值*/rt_uint8_toriginal_priority;/*持有線程的原始優(yōu)先級(jí)*/rt_uint8_thold;/*持有線程的持有次數(shù)*/structrt_thread*owner;/*當(dāng)前持有互斥量的線程*/};9.2.2互斥量工作機(jī)制互斥量的狀態(tài)只有兩種:0和1。當(dāng)互斥量被某線程持有后,其它線程在獲取互斥量時(shí)會(huì)因獲取不到而被掛起,直到持有線程釋放了互斥量,持有線程一旦釋放互斥量,便失去互斥量的所有權(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)先級(jí)*/rt_uint8_thold;/*持有線程的持有次數(shù)*/structrt_thread*owner;/*當(dāng)前持有互斥量的線程*/};9.2.2互斥量工作機(jī)制互斥量的狀態(tài)只有兩種:0和1。持有線程可以多次獲取互斥量,而不會(huì)被掛起,持有線程獲取互斥量后要及時(shí)釋放互斥量,以便其它線程能夠獲取到互斥量,需要注意的是持有線程獲取幾次,便應(yīng)該釋放幾次。./rt-thread/include/rtdef.hstructrt_mutex{structrt_ipc_objectparent;/*繼承自ipc_object*/rt_uint16_tvalue;/*互斥量的值*/rt_uint8_toriginal_priority;/*持有線程的原始優(yōu)先級(jí)*/rt_uint8_thold;/*持有線程的持有次數(shù)*/structrt_thread*owner;/*當(dāng)前持有互斥量的線程*/};9.2.2互斥量工作機(jī)制互斥量和信號(hào)量的不同點(diǎn):互斥量:線程擁有互斥量的所有權(quán),只能由持有線程釋放;支持遞歸訪問(wèn);能防止線程優(yōu)先級(jí)翻轉(zhuǎn)。信號(hào)量:線程不具有信號(hào)量的所有權(quán),可以由任何線程釋放;線程遞歸持有會(huì)形成死鎖;可能發(fā)生線程優(yōu)先級(jí)翻轉(zhuǎn)。./rt-thread/include/rtdef.hstructrt_mutex{structrt_ipc_objectparent;/*繼承自ipc_object*/rt_uint16_tvalue;/*互斥量的值*/rt_uint8_toriginal_priority;/*持有線程的原始優(yōu)先級(jí)*/rt_uint8_thold;/*持有線程的持有次數(shù)*/structrt_thread*owner;/*當(dāng)前持有互斥量的線程*/};9.2.2互斥量工作機(jī)制優(yōu)先級(jí)翻轉(zhuǎn):當(dāng)高優(yōu)先級(jí)線程A通過(guò)信號(hào)量訪問(wèn)共享資源時(shí),如果該信號(hào)量已被低優(yōu)先級(jí)線程C持有,而線程C運(yùn)行時(shí)被中等優(yōu)先級(jí)線程B搶占,造成高優(yōu)先級(jí)線程C被較低優(yōu)先級(jí)線程阻塞,實(shí)時(shí)性難以得到保證。9.2.2互斥量工作機(jī)制9.2.2互斥量工作機(jī)制互斥量可以通過(guò)優(yōu)先級(jí)繼承算法解決優(yōu)先級(jí)翻轉(zhuǎn)問(wèn)題。優(yōu)先級(jí)繼承:暫時(shí)提高低優(yōu)先級(jí)線程C的優(yōu)先級(jí)至高優(yōu)先級(jí)線程A的優(yōu)先級(jí),避免線程C被中等優(yōu)先級(jí)線程B搶占,當(dāng)?shù)蛢?yōu)先級(jí)線程C釋放資源時(shí),再將其優(yōu)先級(jí)復(fù)原。注意:獲得互斥量后,請(qǐng)盡快釋放互斥量,并且在持有互斥量的過(guò)程中,不得再行更改持有互斥量線程的優(yōu)先級(jí)。9.2.2互斥量工作機(jī)制9.2.3互斥量管理方式9.2.4互斥量應(yīng)用方法互斥量的應(yīng)用有固定的步驟,以動(dòng)態(tài)互斥量為例,包括如下4個(gè)步驟:(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)用方法注意:互斥量句柄為全局變量?;コ饬恳诰€程啟動(dòng)前創(chuàng)建。誰(shuí)持有誰(shuí)釋放,盡快釋放。本節(jié)小結(jié)理解互斥量的概念和工作機(jī)制;掌握互斥量應(yīng)用方法。事件集概念事件集工作機(jī)制9.3事件集事件集管理方式事件集應(yīng)用方法本節(jié)小結(jié)9.3.1事件集概念事件集是多個(gè)事件的集合,用與實(shí)現(xiàn)一對(duì)多,多對(duì)多的同步。以坐公交為例,在公交站等公交時(shí)可能有以下幾種情況:(1)P1坐公交去某地(線程),只有一種公交可以到達(dá)目的地,等到此公交即可出發(fā)(特定事件喚醒線程);(2)P1坐公交去某地,有3種公交都可以到達(dá)目的地,等到其中任意一輛即可出發(fā)(任意單個(gè)事件喚醒線程);(3)P1約另一人P2一起去某地,則P1必須要等“P2到達(dá)公交站”與“公交到達(dá)公交站”(事件)兩個(gè)條件都滿足后,才能出發(fā)(多個(gè)事件同時(shí)發(fā)生才喚醒線程)。9.3.2事件集工作機(jī)制事件集控制塊是操作系統(tǒng)用于管理事件集的一個(gè)數(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事件集工作機(jī)制每個(gè)線程都擁有一個(gè)事件信息標(biāo)記,它有三個(gè)屬性:RT_EVENT_FLAG_AND(邏輯與),RT_EVENT_FLAG_OR(邏輯或)和RT_EVENT_FLAG_CLEAR(清除標(biāo)記)。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ā)送一個(gè)或多個(gè)事件的標(biāo)志值返回值成功返回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:接收選項(xiàng)RT_EVENT_FLAG_OR/RT_EVENT_FLAG_AND|RT_EVENT_FLAG_CLEAR參數(shù)4timeout:超時(shí)時(shí)間參數(shù)5recved:指向接收的事件返回值成功返回RT_EOK,超時(shí)返回-RT_ETIMEOUT,其它錯(cuò)誤返回-RT_ERROR9.3.4事件集應(yīng)用方法事件集的應(yīng)用有固定的步驟,以動(dòng)態(tài)事件集為例,包括如下5個(gè)步驟:(1)宏定義事件:#defineE1(1<<1)

#defineE2(1

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論