linux線程同步——條件變量

來源: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);
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章