執行緒 訊號量

2021-06-06 02:48:46 字數 1831 閱讀 1682

訊號量

訊號量本質上是乙個非負的整數計數器,它被用來控制對公共資源的訪問。當公共資源增加時,呼叫函式sem_post()增加訊號量。只有當訊號量值大於0時,才能使用公共資源,使用後,函式sem_wait()減少訊號量。函式sem_trywait()和函式pthread_ mutex_trylock()起同樣的作用,它是函式sem_wait()的非阻塞版本。下面我們逐個介紹和訊號量有關的一些函式,它們都在標頭檔案/usr/include/semaphore.h中定義。

訊號量的資料型別為結構sem_t,它本質上是乙個長整型的數。函式sem_init()用來初始化乙個訊號量。它的原型為:

extern int sem_init __p ((sem_t *__sem, int __pshared, unsigned int __value));

sem為指向訊號量結構的乙個指標;pshared不為0時此訊號量在程序間共享,否則只能為當前程序的所有執行緒共享;value給出了訊號量的初始值。

函式sem_post( sem_t *sem )用來增加訊號量的值。當有執行緒阻塞在這個訊號量上時,呼叫這個函式會使其中的乙個執行緒不在阻塞,選擇機制同樣是由執行緒的排程策略決定的。

函式sem_wait( sem_t *sem )被用來阻塞當前執行緒直到訊號量sem的值大於0,解除阻塞後將sem的值減一,表明公共資源經使用後減少。函式sem_trywait ( sem_t *sem )是函式sem_wait()的非阻塞版本,它直接將訊號量sem的值減一。

函式sem_destroy(sem_t *sem)用來釋放訊號量sem。

下面我們來看乙個使用訊號量的例子。在這個例子中,一共有4個執行緒,其中兩個執行緒負責從檔案讀取資料到公共的緩衝區,另兩個執行緒從緩衝區讀取資料作不同的處理(加和乘運算)。

/* file sem.c */

#include #include #include #define maxstack 100

int stack[maxstack][2];

int size=0;

sem_t sem;

/* 從檔案1.dat讀取資料,每讀一次,訊號量加一*/

void readdata1(void)

fclose(fp);

}/*從檔案2.dat讀取資料*/

void readdata2(void)

fclose(fp);

}/*阻塞等待緩衝區有資料,讀取資料後,釋放空間,繼續等待*/

void handledata1(void)

}void handledata2(void)

}int main(void)

在linux下,我們用命令gcc -lpthread sem.c -o sem生成可執行檔案sem。 我們事先編輯好資料檔案1.dat和2.dat,假設它們的內容分別為1 2 3 4 5 6 7 8 9 10和 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 ,我們執行sem,得到如下的結果:

multiply:-1*-2=2

plus:-1+-2=-3

multiply:9*10=90

plus:-9+-10=-19

multiply:-7*-8=56

plus:-5+-6=-11

multiply:-3*-4=12

plus:9+10=19

plus:7+8=15

plus:5+6=11

從中我們可以看出各個執行緒間的競爭關係。而數值並未按我們原先的順序顯示出來這是由於size這個數值被各個執行緒任意修改的緣故。這也往往是多執行緒程式設計要注意的問題。

執行緒與訊號量

訊號量的資料型別為結構sem t,它本質上是乙個長整型的數。函式sem init 用來初始化乙個訊號量。它的原型為 extern int sem init p sem t sem,int pshared,unsigned int value sem為指向訊號量結構的乙個指標 pshared不為 時此...

執行緒訊號量同步

thread sem.c include include include include define thread number 3 define repeat number 3 define delay time levels 10.0 sem t sem thread number void ...

執行緒 訊號量 sem wait sem post

訊號量的資料型別為結構sem t,它本質上是乙個長整型的數。函式sem init 用來初始化乙個訊號量。它的原型為 extern int sem init p sem t sem,int pshared,unsigned int value sem為指向訊號量結構的乙個指標 pshared不為 時此...