來源:http://www.yuanma.org/data/2006/0721/article_1195.htm
如果現在在等待一個信號。如果該信號被設置,則繼續運行。如果沒有條件變量,我們將會不停的去查詢該信號是否被設置,這樣就會浪費大量的cpu。而通過使用條件變量,我們就可以將等待信號的線程阻塞,直到有信號的時候再去喚醒它。
條件變量的類型是pthread_cond_t。
下面簡單說一下如何使用條件變量。
l 聲明pthread_cond_t變量後,調用pthread_cond_init()函數,第一個參數爲之前聲明的變量。第二個參數在Linux中不起作用。
l 聲明一個pthread_mutex_t變量,並調用pthread_mutex_init()初始化。
l 調用pthread_cond_signal(),發出信號。如果此時有線程在等待該信號,那麼該線程將會喚醒。如果沒有,該信號就會別忽略。
l 如果想喚醒所有等待該信號的線程,調用pthread_cond_broadcast()。
l 調用pthread_cond_wait()等待信號。如果沒有信號,線程將會阻塞,直到有信號。該函數的第一個參數是條件變量,第二個參數是一個mutex。在調用該函數之前必須先獲得互斥量。如果線程阻塞,互斥量將立刻會被釋放。
下面給出一個簡單的使用例子。
#include <pthread.h>
#include <stdio.h>
pthread_mutex_t mutex;
pthread_cond_t cond;
int flag;
void init()
{
pthread_mutex_init(&mutex,NULL);
pthread_cond_init(&cond,NULL);
flag=0;
}
void * Thread_Function(void * arg)
{
//loop infinitely
while(1)
{
pthread_mutex_lock(&mutex);
while(!flag)
pthread_cond_wait(&cond,&mutex);
pthread_mutex_unlock(&mutex);
do_some_work();
}
}
void SetFlag()
{
pthread_mutex_lock(&mutex);
flag=1;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
}