linux學習筆記之訊號量

2021-10-06 11:18:26 字數 3055 閱讀 4003

訊號量機制:*****=》判斷是否具有可用資源;

*****》可用資源 == 訊號 == 訊號量值為1 的訊號;

linux 執行緒的訊號量 簡稱 二值訊號量 === 訊號量的值(0,1)

訊號量的使用框架:

建立訊號量 ===》初始化訊號量 ==》 pv操作 ====》訊號量的銷毀;

0、標頭檔案:#include

1、建立訊號量 : 全域性定義乙個 sem_t 型別的變數;

2、初始化:

int sem_init(sem_t *sem, int pshared, unsigned int value);

功能: 該函式可以用於訊號量的初始化工作;

引數: sem 要初始化的目標訊號量位址;

pshared 訊號量的控制標記,0 表示執行緒使用,非0 程序使用;

value 訊號量的初始值,0 表示沒有資源,1 表示有可用資源;

返回值:成功 0

失敗 -1;

注意:該函式呼叫一般位於執行緒建立之前;

3、訊號量的pv操作:

p 操作: 申請資源 ==》sem_wait()

v 操作: 釋放資源 ==》sem_post()

p 操作:

int sem_wait(sem_t *sem);

功能:該函式可以判斷指定訊號的訊號量值,如果該值為0

則程序阻塞等待,如果該值為1 則繼續執行,並將

該訊號量值減1操作;

引數:sem 訊號量

返回值:成功 0

失敗 -1;

v 操作:

int sem_post(sem_t *sem);

功能:該函式可以將執行的訊號量進行釋放資源的操作,即

函式執行不會阻塞但一定會進行 sem = sem + 1 操作;

引數:sem 訊號量

返回值:成功 0

失敗 -1;

獲取資源個數: int sem_getvalue(sem_t *sem, int *sval);

功能:該函式可以用於獲取指定訊號的訊號量值。

引數:sem 要獲取其值的訊號量

sval 訊號量的當前值;

返回值:成功 0

失敗 -1;

訊號量的銷毀:

int sem_destroy(sem_t *sem);

功能:該函式可以銷毀指定訊號量;

引數:sem 要銷毀的訊號量

返回值:成功 0

失敗 -1;

訊號量的非阻塞申請資源:

int sem_trywait(sem_t *sem);

功能:該函式可以用於非阻塞方式獲取訊號量的資源

引數:sem 要獲取資源的訊號量

返回值:成功 0 表示已經獲取資源

失敗 -1 表示沒有可用資源,但是不會阻塞。

#include

#include

#include

#include

int x =0;

sem_t sem1,sem2;

void

*fun1

(void

* arg)

sem_post

(&sem2)

;pthread_exit(0

);}void

*fun2

(void

* arg)

sem_post

(&sem1)

;pthread_exit(0

);}int

main

(int argc,

char

*ar**)

else

int ret =

pthread_create

(&tid1,

null

,fun1,

null);

ret =

pthread_create

(&tid2,

null

,fun2,

null);

if(ret <0)

printf

("pthread ret = %lu %lu\n"

,tid1,tid2)

;pthread_join

(tid1,

null);

pthread_join

(tid2,

null);

return0;

}

練習: 使用訊號量或者互斥鎖設計乙個模擬火車票售票系統,

要求有100張火車票,有若干個售票視窗,每個視窗都可以

買票,但是不能重複買票,要求將100 張火車票均勻的從

這些視窗中賣出。

#include

#include

#include

#include

int x =

100;

int a=0;

sem_t sem1,sem2,sem3;

void

*fun1

(void

* arg)

}pthread_exit(0

);}void

*fun2

(void

* arg)

}pthread_exit(0

);}void

*fun3

(void

* arg)

}pthread_exit(0

);}int

main

(int argc,

char

*ar**)

printf

("pthread ret = %lu %lu %lu\n"

,tid1,tid2,tid3)

;pthread_join

(tid1,

null);

pthread_join

(tid2,

null);

pthread_join

(tid3,

null);

return0;

}

Linux 之 訊號量

sem init函式 sem destroy函式 sem wait函式 sem trywait函式 sem timedwait函式 sem post函式 以上6 個函式的返回值都是 成功返回0,失敗返回 1,同時設定errno。注意,它們沒有pthread字首 sem init int sem in...

linux同步之訊號量

1.什麼是訊號量 linux sem 訊號量是一種特殊的變數,訪問具有原子性,用於解決程序或執行緒間共享資源引發的同步問題。使用者態程序對 sem 訊號量可以有以下兩種操作 等待訊號量 當訊號量值為 0 時,程式等待 當訊號量值大於 0 時,訊號量減 1,程式繼續執行。傳送訊號量 將訊號量值加 1 ...

linux 之 system v 訊號量

計數器,記錄可以訪問共享資源的次數。保護共享資源 硬體裝置,檔案,共享記憶體等等 訊號量大於0,則可以訪問 訊號量等於0,則不可以訪問。訪問時會將訊號量減1,訪問完成會將訊號量加1。加1減1可由使用者控制 訊號量減小到0之後,程序就不能去訪問共享資源了。int semget key t key,in...