在訊息佇列初始化時,可以將訊息佇列中的多個指標設為非null值(如void* 1),來實現計數訊號量的功能。這裡,初始化為非null值的指標數就是可用的資源數。系統中的任務可以通過osqpend()來請求「訊號量」,然後通過呼叫osqpost()來釋放「訊號量」,如程式清單 l6.28。如果系統中只使用了計數訊號量和訊息佇列,使用這種方法可以有效地節省**空間。這時將os_sem_en設為0,就可以不使用訊號量,而只使用訊息佇列。值得注意的是,這種方法為共享資源引入了大量的指標變數。也就是說,為了節省**空間,犧牲了ram空間。另外,對訊息佇列的操作要比對訊號量的操作慢,因此,當用計數訊號量同步的訊號量很多時,這種方法的效率是非常低的。
程式清單 l6.28 使用訊息佇列作為乙個計數訊號量
os_event *qsem;
void *qmsgtbl[n_resources]
void main (void)..
ostaskcreate(task1, .., .., ..);..
osstart();
}void task1 (void *pdata)
}
等待乙個訊號量, OSSemPend
程式清單 l6.10是ossempend 函式的源 它首先檢查指標pevent所指的任務控制塊是否是由ossemcreate 建立的 l6.10 1 如果訊號量當前是可用的 訊號量的計數值大於0 l6.10 2 將訊號量的計數值減1 l6.10 3 然後函式將 無錯 錯誤 返回給它的呼叫函式。顯然,...
傳送乙個訊號量, OSSemPost
程式清單 l6.11是ossempost 函式的源 它首先檢查引數指標pevent指向的任務控制塊是否是ossemcreate 函式建立的 l6.11 1 接著檢查是否有任務在等待該訊號量 l6.11 2 如果該任務控制塊中的.oseventgrp域不是0,說明有任務正在等待該訊號量。這時,就要呼叫...
C 實現乙個訊號量
訊號量有很多應用場景,事實上只要是生產者 消費者模型,一般都需要乙個訊號量來控制。posix介面是有pv訊號量api的。但c 標準沒有。下面是乙個pv訊號量的簡單實現。有些不熟悉條件變數的人或許產生下面的疑問 1 wait裡已經對mtx加鎖並阻塞了,notify那裡申請mtx的行為豈不是一直等待?條...