執行緒同步與互斥 訊號量

2021-07-30 03:18:45 字數 1622 閱讀 5988

關於訊號量,我們在前面程序間通訊也談到過,今天我們再來看看使用訊號量實現執行緒間的同步與互斥問題。

再來說說什麼是訊號量

號量的操作函式。

sem_init()用來初始化乙個訊號量,sem_t *sem是自己定義的sem變數的位址,pshared引數為0,用於表示訊號量用於同一程序間的執行緒間同步,value參

數表示可用資源的數量。

sem_wait()可以獲得資源,即指p操作,使訊號量的值減1,如果呼叫此函式時semaphore的值已經是0,則該執行緒就掛起等待。

sem_trywait()在申請資源不成功時不會使執行緒掛起等待。我們一般不使用sem_timewait(),該函式設定了自己的等待時間。

sem_post()函式可以釋放資源,即指v操作,使訊號量的值加1,同時喚醒掛起等待的執行緒。引數就是自己定義的訊號量的位址。

可見,執行緒間的pv操作與程序間的pv操作不一樣,程序間是通過semop()來進行操作的。

sem_destroy()函式是用來銷毀訊號量的。引數同樣是sem_t sem的位址。

我們上一節用的是條件變數來實現了消費者——生產者模型,生產者通過往單鏈表的頭部放資料,消費者每次從鍊錶的頭部來讀取資料來實現同步與互

斥,鍊錶為空時就讓消費者去wait,當有資料可以消費時,生產者就去signal消費者。這節我們用訊號量再次來模擬實現一次消費者——生產者模型,這次二者

的交易場所變成了環形buffer,這個環形場所我們用一維陣列來實現。

來看看實現的**:

我們在該**中應該保證生產者先執行,其次需要注意的是:生產者生產資料,會讓資料增多而剩餘空間減小,消費者消費資料,會讓資料減少而剩餘空

間增多。初始化訊號量時,生產者的初始可用資源的陣列的size,而消費者初始可用資源是0。

來看看結果,第一種是生產者每次生產完,消費只進行消費,消費者消費完生產者進行生產。

第二種是生產者生產乙個,消費者就去消費乙個。

互斥量與訊號量(互斥與同步)

互斥量 mutex 互斥量表現互斥現象的資料結構,也被當作二元訊號燈。乙個互斥基本上是乙個多工敏感的二元訊號,它能用作同步多工的行為,它常用作保護從中斷來的臨界段 並且在共享同步使用的資源。mutex本質上說就是一把鎖,提供對資源的獨佔訪問,所以mutex主要的作用是用於互斥。mutex物件的值,只...

執行緒互斥與同步 互斥鎖與訊號量

所謂互斥,就是不同執行緒通過競爭進入臨界區 共享的資料和硬體資源 為了防止訪問衝突,在有限的時間內只允許其中之一獨占性的使用共享資源。如不允許同時寫 同步關係則是多個執行緒彼此合作,通過一定的邏輯關係來共同完成乙個任務。一般來說,同步關係中往往包含互斥,同時對臨界區的資源會按照某種邏輯順序進行訪問。...

linux 執行緒互斥同步By訊號量

今天有空就研究了下linux執行緒間的同步通訊by訊號量,離校錢只是匆匆的從網上看了一點概念性的東西 其實連概念也談不上,就知道有訊號量這麼回事 對於具體的怎麼用 實現也不知道,現在正好有時間,研究了一下。sem t include int sem init sem t sem,int pshare...