唯快不破 多執行緒 使用訊號量進行同步

2021-08-14 06:59:28 字數 2464 閱讀 4165

訊號量是最早出現的用來解決程序同步與互斥問題的機制(也可實現程序通訊),包括乙個稱為訊號量的變數及對它進行的兩個原語操作。訊號量為乙個整數,我們設這個訊號量為:sem。很顯然,我們規定在sem大於等於零的時候代表可供併發程序使用的資源實體數,sem小於零的時候,表示正在等待使用臨界區的程序的個數。根據這個原則,在給訊號量附初值的時候,我們顯然就要設初值大於零。

p操作和v操作是不可中斷的程式段,稱為原語。p,v原語中p是荷蘭語的passeren,相當於英文的pass, v是荷蘭語的verhoog,相當於英文中的incremnet。

且在p,v願語執行期間不允許有中斷的發生。

首先應弄清pv操作的含義:pv操作由p操作原語和v操作原語組成(原語是不可中斷的過程),對訊號量進行操作,具體定義如下:

p(s):①將訊號量s的值減1,即s=s-1;②如果s>=0,則該程序繼續執行;否則該程序置為等待狀態,排入等待佇列。

v(s):①將訊號量s的值加1,即s=s+1;②如果s>0,則該程序繼續執行;否則釋放佇列中第乙個等待訊號量的程序。

pv操作的意義:我們用訊號量及pv操作來實現程序的同步和互斥。pv操作屬於程序的低階通訊。

什麼是訊號量?訊號量(semaphore)的資料結構為乙個值和乙個指標,指標指向等待該 訊號量的下乙個程序。訊號量的值與相應資源的使用情況有關。當它的值大於0時,表示當前可用資源的數量;當它的值小於0時,其絕對值表示等待使用該資源的程序個數。注意,訊號量的值僅能由pv操作來改變。

一般來說,訊號量s>=0時,s表示可用資源的數量。執行一次p操作意味著請求分配乙個單位資源,因此s的值減1;

當s<0時,表示已經沒有可用資源,請求者必須等待別的程序釋放該類資源,它才能執行下去。而執行乙個v操作意味著釋放乙個單位資源,因此s的值加1;

若s<=0,表示有某些程序正在等待該資源,因此要喚醒乙個等待狀態的程序,使之執行下去。

對訊號量有4種操作(include):

1. 初始化(initialize),int set_init(sem_t *sem, int pshared, unsigned int value);//第二引數為0表示程序間不共享

2. 等訊號(wait),int sem_wait(sem_t *sem);//訊號量大於1時,減一併返回;小於1時執行緒阻塞。

3. 給訊號(signal)int sem_post(sem_t *sem);//訊號量加一

4. 清理(destory) int sem_destory(sem_t *sem);

使用訊號量實現生產者-消費者例子:

[cpp]

view plain

copy

#define buffer_size 16 // 緩衝區數量

struct

prodcons  

;  /* 初始化緩衝區結構 */

void

init(

struct

prodcons *b)  

/* 將產品放入緩衝區,這裡是存入乙個整數*/

void

put(

struct

prodcons *b, 

intdata)  

/* 從緩衝區中取出整數*/

intget(

struct

prodcons *b)  

/* 測試:生產者執行緒將1 到100 的整數送入緩衝區,消費者線

程從緩衝區中獲取整數,兩者都列印資訊*/

#define over ( - 1)

struct

prodcons buffer;  

void

*producer(

void

*data)  

put(&buffer, over);  

return

null;  

}  void

*consumer(

void

*data)  

return

null;  

}  int

main(

void

)    

"font-family:'kaiti_gb2312';font-size:18px;"

>

互斥鎖和訊號量的區別:

互斥鎖:

互斥鎖是一種保護機制。上鎖後其他執行緒不能進入保護區域的**,直到鎖被釋放。

訊號量:

訊號量是一種同步機制。訊號量的值代表可用的資源數目,當值大於0代表有可用資源,則允許繼續操作,否則執行緒阻塞,等待可用資源。

當可用資源是1時,訊號量與互斥鎖基本沒區別,都起保護作用。當資源數大於1,則當訊號量大於0時執行緒都可進行操作。如果資源大於1時使用互斥鎖,則就算資源數大於1時,也只能有乙個執行緒進入操作,其餘執行緒必須阻塞。

訊號量可用於程序通訊和執行緒通訊,而互斥鎖只能用於執行緒通訊。

但是還是覺得互斥鎖就可以認為是訊號量的特例。

現在有種突然明白什麼是利用訊號量進行多執行緒同步的含義了。

多執行緒中避免使用訊號量

專案中遇到乙個bug,因為接入了幾家越獄平台 91 同步推 pp助手,在裝置上安裝了三個應用,啟用其中任意乙個,另外二個啟動後無法建立傳送socket訊息,從而導致遊戲直接死在登入那裡,再次點選登入時執行緒才會被喚醒 無法傳送的原因定位到,是因為在呼叫sem post方法後無法將執行緒喚醒 之後我嘗...

判斷sem訊號量為零 多執行緒訊號量如何使用

利用 二進位制訊號量 0和1 完成 控制線程順序 為中心的同步方法。include int sem init sem t sem,int pshared,unsigned value int sem destory sem t sem 建立及銷毀的方法 include int sem post se...

linux 多執行緒程式設計 訊號量的使用

訊號是e.w.dijkstra在二十世紀六十年代末設計的一種程式設計架構。dijkstra的模型與鐵路操作有關 假設某段鐵路是單線的,因此一次只允許一列火車通過。訊號將用於同步通過該軌道的火車。火車在進入單一軌道之前必須等待訊號燈變為允許通行的狀態。火車進入軌道後,會改變訊號狀態,防止其他火車進入該...