Linux執行緒間用訊號量通訊

2021-07-29 12:15:48 字數 781 閱讀 5040

原來總是用互斥鎖(mutex)和環境變數(cond)去控制線程的通訊,用起來挺麻煩的,用訊號量(sem)來通訊控制就方便多了!

用到訊號量就要包含semaphore.h標頭檔案。

可以用sem_t型別來宣告乙個型號量。

用int sem_init(sem_t *sem, int pshared, unsigned int value)函式來初始化型號量,第乙個引數就是用sem_t宣告的訊號量,第二變數如果為0,表示這個訊號量只是當前程序中的型號量,如果不為0,這個訊號量可能可以在兩個程序中共享。第三個引數就是初始化訊號量的多少值。

sem_wait(sem_t *sem)函式用於接受訊號,當sem>0時就能接受到訊號,然後將sem--;

sem_post(sem_t *sem)函式可以增加訊號量。

sem_destroy(sem_t *sem)函式用於解除訊號量。

以下是乙個用訊號控制的乙個簡單的例子。

1.#include

2.#include

3.#include

4.sem_t sem1, sem2; 

5. 

6.void *thread1(void *arg) 

7. 

13. 

14.void *thread2(void *arg) 

15. 

19. 

20.int main() 

21. 

程式的實現是控制先讓thread1執行緒列印"hello "再讓thread2執行緒列印"world!". 

linux執行緒間通訊 訊號量

鎖機制使用是有限制的,鎖只有兩種狀態,即加鎖和解鎖,對於互斥的訪問乙個全域性變數,這樣的方式還可以對付,但是要是對於其他的臨界資源,比如說多台印表機等,這種方式顯然不行了。訊號量機制在作業系統裡面學習的比較熟悉了,訊號量是乙個整數計數器,其數值表示空閒臨界資源的數量。當有程序釋放資源時,訊號量增加,...

linux 訊號量(程序間通訊)

將使用乙個程式來演示訊號量的使用,程式用pv操作控制訊號量,以操作臨界區,p操作讓訊號量減1,v操作讓訊號量加1,而pv操作之間的 即為臨界區關鍵 每次只能由乙個程序訪問。程式建立出乙個子程序,在兩個程序中分別有一段臨界區關鍵 實現的功能都是不斷的順序輸出0 9的字元。保證程序間同步 plain v...

linux 程序間通訊 訊號量

例項中首先使用fork 建立乙個子程序,在父程序呼叫kill 之前,在子程序中使用raise 向自身傳送sigstop訊號,是子程序暫停。接下來使用kill 向子程序傳送訊號 ngnsvr9 none home xionghailong example cat kill raise.c includ...