Linux基礎 執行緒同步之訊號量

2021-10-07 09:04:59 字數 1291 閱讀 1425

他和管道不同在於,他主要是保護資料,而不是傳輸資料,他是為了在某乙個時刻只有乙個執行緒(或程序)來對資料進行操作

注意:訊號量和訊號是兩個不同的關係,要做乙個區分。

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...