近來在項目中用到條件變量和信號量作同步時,這一塊一直都有了解,但也一直沒有總結,此次總結一下,給你們提供點參考,也給本身留點記念。html
首先,關於信號量和條件變量的概念能夠自行查看APUE,我這直接把APUE中的代碼拿過來對比;spa
條件變量的使用:線程
#include <pthread.h> struct msg { struct msg *m_next; /* ... more stuff here ... */ }; struct msg *workq; pthread_cond_t qready = PTHREAD_COND_INITIALIZER; pthread_mutex_t qlock = PTHREAD_MUTEX_INITIALIZER; void process_msg(void) { struct msg *mp; for (;;) { pthread_mutex_lock(&qlock); while (workq == NULL) pthread_cond_wait(&qready, &qlock); mp = workq; workq = mp->m_next; pthread_mutex_unlock(&qlock); /* now process the message mp */ } } void enqueue_msg(struct msg *mp) { pthread_mutex_lock(&qlock); mp->m_next = workq; workq = mp; pthread_mutex_unlock(&qlock); pthread_cond_signal(&qready); }
其中最後在調用也能夠按照下面格式調用,兩種各有優劣,具體能夠參考:http://www.javashuo.com/article/p-tzdowvkx-n.htmlcode
pthread_mutex_lock(&qlock); mp->m_next = workq; workq = mp;
pthread_cond_signal
pthread_mutex_unlock
條件變量和信號量的區別:htm
(1)使用條件變量能夠一次喚醒全部等待者,而這個信號量沒有的功能,感受是最大區別。blog
(2)信號量是有一個值(狀態的),而條件變量是沒有的,沒有地方記錄喚醒(發送信號)過多少次,也沒有地方記錄喚醒線程(wait返回)過多少次。從實現上來講一個信號量能夠是用mutex + counter + condition variable實現的。由於信號量有一個狀態,若是想精準的同步,那麼信號量可能會有特殊的地方。信號量能夠解決條件變量中存在的喚醒丟失問題。進程
(3)在Posix.1基本原理一文聲稱,有了互斥鎖和條件變量還提供信號量的緣由是:「本標準提供信號量的而主要目的是提供一種進程間同步的方式;這些進程可能共享也可能不共享內存區。互斥鎖和條件變量是做爲線程間的同步機制說明的;這些線程老是共享(某個)內存區。這二者都是已普遍使用了多年的同步方式。每組原語都特別適合於特定的問題」。儘管信號量的意圖在於進程間同步,互斥鎖和條件變量的意圖在於線程間同步,可是信號量也可用於線程間,互斥鎖和條件變量也可用於進程間。應當根據實際的狀況進行決定。信號量最有用的場景是用以指明可用資源的數量。內存
經典的一句話:資源
互斥量是信號量的一種特例,互斥量的本質是一把鎖。A mutex is basically a lock that we set (lock) before accessing a shared resource and release (unlock) when we're doneget