linux條件變量使用和與信號量的區別

近來在項目中用到條件變量和信號量作同步時,這一塊一直都有了解,但也一直沒有總結,此次總結一下,給你們提供點參考,也給本身留點記念。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

相關文章
相關標籤/搜索