Linux關於執行緒同步
阿新 • • 發佈:2018-12-12
關於執行緒的瞭解,可以閱讀前一篇文章《Linux關於多執行緒》,瞭解執行緒後,閱讀本文章會比較容易
以下程式碼是想讓一個執行緒count進行累加,另一邊讀出來,每次累加就讀出來一次
#include<stdio.h> #include<pthread.h> #include<unistd.h> #include<stdlib.h> int count = 0; void *thr1(void *arg) { while(1) { sleep(1); count+=10; } } void *thr2(void *arg) { while(1) { printf("%d\n",count); } } int main() { pthread_t tid1,tid2; pthread_create(&tid1,NULL,thr1,NULL); pthread_create(&tid2,NULL,thr2,NULL); pthread_join(tid1,NULL); pthread_join(tid2,NULL); }
但是實際結果卻不是這樣的,會無限迴圈,兩個執行緒不會進行同步
下面我們使用訊號量,進行PV操作,讓執行緒進行同步
#include<stdio.h> #include<pthread.h> #include<unistd.h> #include<stdlib.h> #include <semaphore.h> sem_t sem; int count = 0; void *thr1(void *arg) { while(1) { sleep(1); sem_post(&sem);//V操作 count+=10; } } void *thr2(void *arg) { while(1) { sem_wait(&sem);//P操作 printf("%d\n",count); } } int main() { pthread_t tid1,tid2; pthread_create(&tid1,NULL,thr1,NULL); pthread_create(&tid2,NULL,thr2,NULL); pthread_join(tid1,NULL); pthread_join(tid2,NULL); }
結果如下:實現執行緒同步