Linux 執行緒同步 訊號量

2021-08-28 14:37:55 字數 1769 閱讀 7786

linux-執行緒同步訊號量

訊號量用於多執行緒多工同步,乙個執行緒完成了某乙個動作後就通過訊號量告訴其他執行緒再進行某些動作,其他執行緒在等待某乙個執行緒時會阻塞。

init

sem_t sem; 

sem_init(&sem,0,0); 函式原型如下:

int sem_init(sem_t *sem, intpshared, unsigned intvalue);

pshared:0:shared between the threads of process.

!0:shared between processes.

value: initial value for the semaphore.

wait

sem_wait(&sem);    

p操作,if(value>0);value--;執行**。if(value<=0);阻塞並等待post把value+1。

post

sem_post(&sem);

v操作,value++;通知wait進行value的原子操作,v操作不阻塞繼續執行。

trywait

sem_trywait(&sem);

非阻塞版,如果訊號量計數大於0,則訊號量立即減1並返回0,否則立即返回-1。

getvalue

sem_getvalue(&sem, &sval)

讀取sem中訊號量計數,存於sval中,並返回0。

/*gcc sem.c -lpthread*/

//使用者從終端輸入任意字元然後統計個數顯示,輸入end則結束

//使用多執行緒實現:主線程獲取使用者輸入並判斷是否退出,子執行緒計數

#include #include #include #include #include char buf[100]=;

int flag = 0;

sem_t sem;

// 子執行緒程式,作用是統計buf中的字元個數並列印

void *func(void*arg)

pthread_exit(null);

}int main(void)

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

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

// 主線程在收到使用者收入的字串,並且確認不是end後

// 就去發訊號啟用子執行緒來計數。

// 子執行緒被阻塞,主線程可以啟用,這就是執行緒的同步問題。

// 訊號量就可以用來實現這個執行緒同步

sem_post(&sem);

}// **子執行緒

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

ret = pthread_join(th, null);

if (ret != 0)

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

sem_destroy(&sem);

return 0;

}//intsem_wait(sem_t *sem); 等待訊號量,如果訊號量的值大於0,將訊號量的值減1,立即返回。

//如果訊號量的值為0,則執行緒阻塞。相當於p操作。成功返回0,失敗返回-1。

//intsem_post(sem_t *sem); 釋放訊號量,讓訊號量的值加1。相當於v操作。

執行緒訊號量同步

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