Linux下的訊號燈semaphore的應用
阿新 • • 發佈:2018-11-20
如果使用mutex_lock,mutex_unlock方式同步操作,如果當很長一段時間內都沒有任何操作,
但是執行緒依然會不停地執行lock,unlock操作。所以這樣的做法是完全沒有任何的意義的。
Linux系統還提供了另外一種同步機制,訊號燈,Semaphore。使用方法如下例子:
示例說明:一個執行緒在控制檯輸入,另一個執行緒將輸入的結果列印顯示。
示例程式碼如下:
#include "pthread_head.h" sem_t sem; char buf[SIZE]; void *tfn1(void *arg) { int i; for(i = 0; ; i++){ sem_wait(&sem); //p操作 if(strncmp(buf,"quit",4) == 0) break; printf("%s",buf); } return (void*)0; } void *tfn2(void *arg) { int i; for(i = 0; ; i++){ fgets(buf,SIZE,stdin); sem_post(&sem); //v操作 if(strncmp(buf,"quit",4) == 0) break; } return (void*)0; } int main(void) { pthread_t tid1, tid2; sem_init(&sem,0,0); if(pthread_create(&tid1,NULL,tfn1,NULL) < 0) p_error("pthread_create"); if(pthread_create(&tid2,NULL,tfn2,NULL) < 0) p_error("pthread_create"); if(pthread_join(tid1,NULL) < 0) p_error("pthread_join"); if(pthread_join(tid2,NULL) < 0) p_error("pthread_join"); return 0; }