訊號量sem wait 的使用

2021-07-05 13:34:06 字數 1037 閱讀 3127

閒來無事,我給大家講下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嘛就是讀取當前的訊號燈的數目。

訊號量sem wait 的使用

閒來無事,我給大家講下unix linux下訊號量函式的使用。首先你得知道什麼叫訊號量,什麼時候要用訊號量。這個嘛,主要就是用來保護共享資源的,也就是說如果你想限制某個 些 資源在同一時刻只能有一 多 個執行緒擁有,就可以使用訊號量。當然也可以用作讓乙個執行緒等待另乙個執行緒完成某項工作。用下面一組...

訊號量 二值訊號量

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

python訊號量 Python訊號量

python訊號量教程 訊號量是由作業系統管理的一種抽象資料型別,用於在多執行緒中同步對共享資源的使用。本質上說,訊號量是乙個內部資料,用於標明當前的共享資源可以有多少併發讀取。也可以簡單的理解為,訊號量是多把鎖,同時允許多個執行緒來更改資料,而 python訊號量與互斥鎖的關係 訊號量的乙個特殊用...