他和管道不同在於,他主要是保護資料,而不是傳輸資料,他是為了在某乙個時刻只有乙個執行緒(或程序)來對資料進行操作。
注意:訊號量和訊號是兩個不同的關係,要做乙個區分。
sem_t 建立訊號量
sem_init 初始化訊號量
sem_wait 阻塞
sem_trywait 嘗試阻塞
sem_timedwait 計時阻塞
sem_post 喚醒訊號量
sem_destroy 銷毀訊號量
sem_t型別,用來建立訊號量
作用:對給定訊號量物件進行初始化。
2.4.1、普通阻塞
函式:int sem_wait(sem_t *sem);
引數解析:傳入乙個訊號量結構體,來改變物件的值
作用:把訊號量- -,如果訊號量的值大於零,那麼解析繼續進行,函式立即返回。 如果訊號量當前的值為零,那麼呼叫就會阻塞,直到可以執行減量操作(例如,訊號量值上公升到零以上) ,或者訊號中斷呼叫
2.4.2、嘗試阻塞
函式:int sem_trywait(sem_t *sem);
引數解析:傳入乙個訊號量結構體,來改變物件的值
作用:與 sem_wait ()相同,只是如果不能立即執行遞減操作,則呼叫返回乙個錯誤(errno set to eagain) ,而不是阻塞。
2.4.2、計時阻塞
作用:sem wait ()相同,只是 abs_timeout指定了乙個限制,如果不能立即按形式減少呼叫,則呼叫應該阻塞的時間量,超過時間返回錯誤。
時間結構體
struct timespec
;
#include
#include
#include
#include
//建立乙個可容納5個物體的空間
#define num 5
int queue[num]
;//建立兩個訊號變數消費者和生產者
//可以理解成blank_number為剩餘空間
//product_number為已占用的空間
sem_t blank_number, product_number;
//生產者建立物體
void
*producer
(void
*arg)
}//消費者消費物體
void
*consumer
(void
*arg)
}int
main
(void
)
Linux 執行緒同步之訊號量同步
linux中兩種基本的同步方法是訊號量和互斥量。這兩種方法很相似,而且它們可以相互通過對方來實現。下面介紹用訊號量進行同步。訊號量概念由荷蘭科學家dijkstra首先提出。訊號量是乙個特殊型別的變數,它可以被增加或者減少。但對其的關鍵訪問被保證是原子操作,即使在乙個多執行緒程式中也是如此。訊號量有兩...
Linux 執行緒同步之訊號量同步
linux中兩種基本的同步方法是訊號量和互斥量。這兩種方法很相似,而且它們可以相互通過對方來實現。下面介紹用訊號量進行同步。訊號量概念由荷蘭科學家dijkstra首先提出。訊號量是乙個特殊型別的變數,它可以被增加或者減少。但對其的關鍵訪問被保證是原子操作,即使在乙個多執行緒程式中也是如此。訊號量有兩...
Linux執行緒同步之訊號量
訊號量可以同時訪問多份資源。include intsem init sem t sem,int pshared,unsigned int value int sem destroy sem t sem int sem post sem t sem int sem wait sem t sem int...