執行緒同步 訊號量

2021-08-18 19:16:30 字數 1691 閱讀 7420

posix訊號量

posix訊號量和systemv訊號量作用相同,都是用於同步操作。

訊號量和互斥鎖的區別:互斥鎖只允許乙個執行緒進入臨界區;訊號量同一時刻允許多個執行緒進入臨界區。

(1)初始化訊號量#include

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

引數:

sem: 訊號量位址;

pshared: 0表示執行緒間通訊,非0表示程序間通訊;

value: 訊號量的初始值;

(2)等待訊號量與發布訊號量

//類似p操作

int sem_wait(sem_t *sem);//阻塞

int sem_trywait(sem_t *sem);//非阻塞

sem_wait()將訊號量的值減1,操作前要檢查(sem)是否為0,若為0,則執行緒會阻塞,直到大於0時進行減1操作;sem_trywait()以非阻塞的方式對訊號量減1,如果(sem)等於0,對訊號量操作失敗,立即返回。

(3)發布訊號量

//類似v操作

int sem_post(sem_t *sem);

釋放訊號量,將訊號量的值加1,並發出訊號喚醒等待執行緒(sem_wait())。

(4)獲取訊號量的值

int sem_getvalue(sem_t *sem,int *sval);

獲取訊號量sem的值,並儲存在sval中。

引數:

sem:訊號量位址;

sval: 儲存訊號量的位址

(5)銷毀訊號量

int sem_destroy(sem_t *sem);

例子:主線程輸入字串,子執行緒統計個數並列印

#include

#include

#include

#include

#include

#include

char buf[1024] = ;

int flag;

sem_t sem;//定義訊號量

//子執行緒統計字串的長度

//子執行緒應該有個迴圈

//迴圈中阻塞在等待主線程啟用的時候,子執行緒啟用就去統計

//統計完畢後,再次被阻塞

void* pthread_func(void* arg)

return null;

}int main()

printf("輸入乙個字串,回車結束!\n");

while(scanf("%s",buf))

sem_post(&sem);

}//**子執行緒

printf("等待子執行緒**!\n");

ret = pthread_join(tid,null);

if(ret!=0)

printf("子執行緒**成功!\n");

//銷毀訊號量

sem_destroy(&sem);

return

0;}

結果:

執行緒訊號量同步

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

執行緒同步 訊號量

執行緒同步方法 訊號量不常用,找到個帖子不錯,記錄一下!依賴的標頭檔案 include 函式宣告 sem t 表示訊號量 int sem init sem t sem,int pshared,unsigned int value 名稱 sem init 功能 initialize an unname...

執行緒同步 訊號量

進化版的互斥鎖 1 n 由於互斥鎖的粒度比較大,如果我們希望在多個執行緒間對某一物件的部分資料進行共享,使用互斥鎖是沒有辦法實現的,只能將整個資料物件鎖住。這樣雖然達到了多執行緒操作共享資料時保證資料正確性的目的,卻無形中導致執行緒的併發性下降。執行緒從並行執行,變成了序列執行。與直接使用單程序無異...