任務的同步與通訊 讀書筆記 6

2021-07-22 17:42:36 字數 1894 閱讀 5620

訊號量、訊號量的操作(建立訊號量、請求訊號量、傳送訊號量、刪除訊號量、查詢訊號量的狀態)

4.2訊號量及其操作

4.2.1訊號量

(1)當事件控制塊成員oseventtype的值被設定為os_event_type_sem時,這個事件控制塊描述的就是乙個訊號量。

(2)訊號量是由訊號量計數器和任務等待錶兩部分組成。

(3)每當有任務申請訊號量時,

如果訊號量計數器os_eventcnt() > 0,oseventcnt – 1,任務繼續執行;

os_eventcnt() == 0, oseventcnt = 0,任務列入等待表;

如果正在使用訊號量的任務釋放了該訊號量,就會在任務等待表中找出優先級別最高的等待任務,並在使它就緒後呼叫排程器引發一次排程;

如果任務等待表彙總沒有等待任務,訊號量+ 1;

4.2.2訊號量的操作

1.建立訊號量

在使用訊號量之前,應用程式必須呼叫函式ossemcreate()來建立乙個訊號量。

函式原型:

os_event *ossemcreate(

int16u cot            //訊號量計數器初值

返回值為已建立的訊號量的指標。

2.請求訊號量

(1)任務通過呼叫函式ossempend()請求訊號量,函式原型:

void ossempend(

os_evnet *pevent,    //訊號量的指標

int16u timeout,      //等待時限

int8u *err           //錯誤資訊

引數pevent是被請求訊號量的指標。

timeout:任務等待時間限制,超過該時間可以結束等待狀態而進入就緒狀態。

timeout = 0時,等待時間無限長。

err:呼叫成功後值為os_no_err,失敗則會根據出現的具體錯誤產生不同的值。

(2)訪問共享資源時,先請求管理該資源的訊號量,根據訊號量是否有效決定該任務是否可以繼續執行。

(3)如果希望在訊號量無效時准許任務不進入等待狀態而繼續執行,則不用函式ossempend(),而是呼叫函式ossemaccept()來請求訊號量。

3.傳送訊號量

(1)釋放訊號量也叫傳送訊號量;

(2)傳送訊號量必須呼叫函式ossempost():

該函式對訊號量計數器操作之前,先檢查是否還有等待該訊號量的任務;

沒有—>osevemtcnt + 1;

有  -->排程器os_sched()執行等待任務中優先級別最高的任務。

4.刪除訊號量

(1)ossemdel()

原型:os_event *ossemdel(

os_event *pevent,     //訊號量的指標

int8u opt,            //刪除條件選擇

int8u *err            //錯誤資訊

opt:指明訊號量的刪除條件,該引數有兩個引數值可以選擇:

os_del_no_pend,當等待任務表中已沒有等待任務時才刪除訊號量

(2)注意:只能在任務中刪除訊號量,不能在中斷服務程式中刪除。

5.查詢訊號量的狀態

(1)ossemquery(),隨時查詢訊號量的當前狀態;

(2)原型:

int8u ossemquery

os_event_ *pevent,      //訊號量指標

os_sem_data *pdata      //儲存訊號量裝入結構

c primer 讀書筆記6

else 用,操作符改寫為一行。std cout total std endl,total trans switch.case中,case標號必須是整型常量表示式。switch內部變數定義 只能在最後乙個標號或default標號後面定義變數。四種除錯中非常有用的常量 file 檔名 line 當前行...

《C Primer》讀書筆記(6)

1.類的預設建構函式只是在類沒有定義建構函式的時候才自動加上去的,而如果定義了乙個建構函式,則不會新增預設建構函式了。此時如果還想要預設建構函式,需要自己寫乙個預設建構函式。2.友元函式和友元類 include stdafx.h include using namespace std class a...

VSTS For Testers讀書筆記 6

四 編輯webtest 4 資料繫結 資料繫結 1 執行資料驅動型測試是恰當的負載測試的乙個重要方面,原因是這種測試更為真實地模仿了現實世界中的活動,並有助於確保有效地使用伺服器快取等資源。通過使用資料繫結,可以將資料從源資料庫繫結到某個要求資料的請求的一部分,例如繫結到某個請求的窗體傳送引數。可以...