C 實現乙個訊號量

2022-04-01 18:17:26 字數 671 閱讀 2858

訊號量有很多應用場景,事實上只要是生產者-消費者模型,一般都需要乙個訊號量來控制。

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...