1. 程式人生 > >執行緒級--訊號量

執行緒級--訊號量

標頭檔案:include <semaphore>
主要的函式:

1.初始化訊號量
函式原型:int sem_init(sem_t* sem,int pshared,unsigned int value)
引數:
sem:指定是哪一個訊號量
pshared:指定訊號量的型別,值為0表示是在當前程序使用的區域性訊號量,否則該訊號量就可以在多個程序中共享。
value:指定訊號量的初始值,可以理解為最多由多少個執行緒可以訪問共享資源。
返回值:

2.銷燬訊號量
函式原型:int sem_destroy(sem_t* sem)
函式功能:釋放訊號量佔用的核心資源,注意不能釋放正在被執行緒其他等待的訊號量,否則會出現錯誤。
返回值:

3.加鎖
函式原型:int sem_wait(sem_t* sem)
函式功能:對訊號量的值value進行-1操作,相當於p操作。如果value的值為0,會發生阻塞。

4.嘗試加鎖
函式原型:int sem_trywait(sem_t* sem)
函式功能:對訊號量的值value進行-1操作,相當於p操作。如果value的值為0,會立即返回,不發生阻塞。

5.解鎖
函式原型:int sem_post(sem_t* sem)
函式功能:對訊號量的值value進行+1操作,相當於v操作。當訊號量的值value大於0時,其他呼叫sem_wait()正在等待訊號量的執行緒將被喚醒。

執行緒級訊號量相對於互斥鎖對於執行緒的控制尺度更大,在sem_init()第三個引數可以控制同時訪問共享資源的執行緒的個數,通過這個引數,可以實現同步控制、互斥、以及阻塞。

比如兩個執行緒協同工作,只有在一個工作執行緒完成對共享資源的訪問操作之後,另外一個工作執行緒才可以對共享資源做訪問。還有比如只有當事件發生後才能讓執行緒開始工作,需要讓執行緒在此之間處於阻塞的狀態,一旦事件發生後,喚醒等待的執行緒即可開始工作。