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