訊號量程式設計

2021-06-25 13:12:00 字數 1240 閱讀 9944

訊號量sem_wait()的使用

閒來無事,我給大家講下unix/linux下訊號量函式的使用。

首先你得知道什麼叫訊號量,什麼時候要用訊號量。

這個嘛,主要就是用來保護共享資源的,也就是說如果你想限制某個(些)資源在同一時刻只能有一(多)個執行緒擁有,就可以使用訊號量。當然也可以用作讓乙個執行緒等待另乙個執行緒完成某項工作。

用下面一組函式(系統呼叫)來實現。

int sem_init(sem_t *sem,int pshared,unsigned int value); 

int sem_destroy(sem_t *sem); 

int sem_wait(sem_t *sem); 

int sem_trywait(sem_t *sem); 

int sem_post(sem_t *sem); 

int sem_getvalue(sem_t *sem); 

具體要include什麼標頭檔案,在你的系統上man sem_init吧。

這組函式是posix標準的無名訊號量函式,另外還有具名訊號亮,這個嘛,等下回再說。

看乙個例子,比如有兩個執行緒都要往印表機上打東西,但是同一時刻只能打乙個。

那麼首先用sem_init初始化乙個訊號量,注意pshared表示允許幾個程序共享該訊號量,一般設0用於程序內的多執行緒共享,要看是否支援程序共享,請檢視下你的系統的man手冊。

第三個引數value表示可用的資源的數目,即訊號燈的數目,咱們這兒只有1個印表機所以設成1。

然後執行緒呼叫sem_wait取獲取這個訊號燈,第乙個執行緒一看,有1個,他就拿到了,然後可以繼續後繼操作,此時訊號燈自動減1,變成0個。那麼第二個執行緒呼叫sem_wait時就會阻塞在這兒了。

第乙個執行緒完成列印後,呼叫sem_post釋放訊號燈,訊號燈數目變成1,將會喚醒等待的第二個執行緒,然後第二個執行緒接著列印。

最後當所有任務完成後,主線程呼叫sem_destroy釋放這個訊號量。

ok?另外幾個函式sem_trywait ,顧名思義,望文生義,就是測試一下看看現在有沒有可用的訊號燈,而不會阻塞。

sem_getvalue嘛就是讀取當前的訊號燈的數目。

int number; // 被保護的全域性變數

sem_t sem_id1, sem_id2;

void* thread_one_fun(void *arg)

void* thread_two_fun(void *arg)

int main(int argc,char *argv)

訊號量程式設計

訊號量 semaphore 是linux程序間通訊的一種方式。但是,與其他程序間通訊方式不大相同,主要用途是保護臨界資源 程序互斥 程序可以根據它判定是否能夠訪問某些共享資源。除了用於訪問控制外,還可用於程序同步。訊號量的實質是乙個數字。在程式開始時,設定訊號量為1,先獲取到訊號量的程序將訊號量 1...

訊號量互斥程式設計

訊號量 訊號量 又名 訊號燈 與其他程序間通訊方式不大相同,主要用途是保護臨界資源 程序互斥 程序可以根據它判定是否能夠訪問某些共享資源。除了用於訪問控制外,還可以用於程序同步。訊號量分類 二值訊號量 訊號量的值只能取0或1 計數訊號量 訊號量的值可以取任意非負值 建立 開啟訊號量集合 函式名 se...

訊號量 二值訊號量

訊號量 二值訊號量 訊號量是作業系統的重要部分,訊號量一般用來進行資源管理和任務同步。freertos中訊號量分為二值訊號量 互斥訊號量 計數訊號量和遞迴互斥訊號量,應用場景各不同。二值訊號量通常用於互斥訪問或同步,二值訊號量和互斥訊號量非常相似,但互斥訊號量有優先順序,二值訊號量沒有。因此二值訊號...