訊號量有很多應用場景,事實上只要是生產者-消費者模型,一般都需要乙個訊號量來控制。
posix介面是有pv訊號量api的。但c++標準沒有。下面是乙個pv訊號量的簡單實現。有些不熟悉條件變數的人或許產生下面的疑問:
1、wait裡已經對mtx加鎖並阻塞了,notify那裡申請mtx的行為豈不是一直等待?
條件變數的實現,會自動解鎖mutex並阻塞當前執行緒。參見 std::condition_variable
2、為什麼要在乙個while迴圈裡wait條件變數?
簡而言之,就是作業系統不能保證每次執行緒被喚醒時,條件變數的條件都是滿足的;但可以保證,只要條件滿足,就一定會喚醒。
參見spurious wakeup
#include #include class semaphore
inline void notify()
inline void wait()
//the while loop can be replaced as below.
( lock, [&] () );
count--;
}private:
std::mutex mtx;
std::condition_variable cv;
int count;
};
等待乙個訊號量, 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 11 實現訊號量
簡單來說,就是訊號量太容易出錯了 too error prone 通過組合互斥鎖 mutex 和條件變數 condition variable 可以達到相同的效果,且更加安全。實現如下 class semaphore void signal void wait count private boost...