<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-20  評論-2  文章-0  trackbacks-0

    一、什么是條件變量

           與互斥鎖不同,條件變量是用來等待而不是用來上鎖的。條件變量用來自動阻塞一個線程,直到某特殊情況發生為止。通常條件變量和互斥鎖同時使用。

           條件變量使我們可以睡眠等待某種條件出現。條件變量是利用線程間共享的全局變量進行同步的一種機制,主要包括兩個動作:一個線程等待"條件變量的條件成立"而掛起;另一個線程使"條件成立"(給出條件成立信號)。

    條 件的檢測是在互斥鎖的保護下進行的。如果一個條件為假,一個線程自動阻塞,并釋放等待狀態改變的互斥鎖。如果另一個線程改變了條件,它發信號給關聯的條件 變量,喚醒一個或多個等待它的線程,重新獲得互斥鎖,重新評價條件。如果兩進程共享可讀寫的內存,條件變量可以被用來實現這兩進程間的線程同步。

           使用條件變量之前要先進行初始化。可以在單個語句中生成和初始化一個條件變量如:

    pthread_cond_t my_condition=PTHREAD_COND_INITIALIZER;(用于進程間線程的通信)。

    也可以利用函數pthread_cond_init動態初始化。

     

    二、條件變量函數

    1

    名稱:

    pthread_cond_init

    目標:

    條件變量初始化

    頭文件:

    #include < pthread.h>

    函數原形:

    int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr);

    參數:

    cptr  條件變量

    attr  條件變量屬性

    返回值:

    成功返回0,出錯返回錯誤編號。

         

     

     

     

     

     

      pthread_cond_init函數可以用來初始化一個條件變量。他使用變量attr所指定的屬性來初始化一個條件變量,如果參數attr為空,那么它將使用缺省的屬性來設置所指定的條件變量。

     

    2.

    名稱:

    pthread_cond_destroy

    目標:

    條件變量摧毀

    頭文件:

    #include < pthread.h>

    函數原形:

    int pthread_cond_destroy(pthread_cond_t *cond);

    參數:

    cptr  條件變量

    返回值:

    成功返回0,出錯返回錯誤編號。

          

     

     

     pthread_cond_destroy函數可以用來摧毀所指定的條件變量,同時將會釋放所給它分配的資源。調用該函數的進程也并不要求等待在參數所指定的條件變量上。

     

    3.

    名稱:

    pthread_cond_wait/pthread_cond_timedwait

    目標:

    條件變量等待

    頭文件:

    #include < pthread.h>

    函數原形:

    int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex);

    int pthread_cond_timedwait(pthread_cond_t *cond,pthread_mutex_t mytex,const struct timespec *abstime);

    參數:

    cond 條件變量

    mutex 互斥鎖

    返回值:

    成功返回0,出錯返回錯誤編號。

          

     

     

     

     

     

     

    第一個參數*cond是指向一個條件變量的指針。第二個參數*mutex則是對相關的互斥鎖的指針。函數pthread_cond_timedwait函數類型與函數pthread_cond_wait,區別在于,如果達到或是超過所引用的參數*abstime,它將結束并返回錯誤ETIME.pthread_cond_timedwait函數的參數*abstime指向一個timespec結構。該結構如下:

    typedef struct timespec{

           time_t tv_sec;

           long tv_nsex;

    }timespec_t;

     

    3.

    名稱:

    pthread_cond_signal/pthread_cond_broadcast

    目標:

    條件變量通知

    頭文件:

    #include < pthread.h>

    函數原形:

    int pthread_cond_signal(pthread_cond_t *cond);

    int pthread_cond_broadcast(pthread_cond_t *cond);

    參數:

    cond 條件變量

    返回值:

    成功返回0,出錯返回錯誤編號。

          

     

     

     

     

     參數*cond是對類型為pthread_cond_t 的一個條件變量的指針。當調用pthread_cond_signal時一個在相同條件變量上阻塞的線程將被解鎖。如果同時有多個線程阻塞,則由調度策略確定接收通知的線程。如果調用pthread_cond_broadcast,則將通知阻塞在這個條件變量上的所有線程。一旦被喚醒,線程仍然會要求互斥鎖。如果當前沒有線程等待通知,則上面兩種調用實際上成為一個空操作。如果參數*cond指向非法地址,則返回值EINVAL

     

    下面是一個簡單的例子,我們可以從程序的運行來了解條件變量的作用。

    #include <pthread.h>
    #include <stdio.h>
    #include <stdlib.h>

    pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;/*
    初始化互斥鎖*/
    pthread_cond_t cond = PTHREAD_COND_INITIALIZER;/*
    初始化條件變量*/

    void *thread1(void *);
    void *thread2(void *);

    int i=1;
    int main(void)
    {
        pthread_t t_a;
        pthread_t t_b;

        pthread_create(&t_a,NULL,thread2,(void *)NULL);/*
    創建進程t_a*/
        pthread_create(&t_b,NULL,thread1,(void *)NULL); /*
    創建進程t_b*/
        pthread_join(t_b, NULL);/*
    等待進程t_b結束*/
        pthread_mutex_destroy(&mutex);
        pthread_cond_destroy(&cond);
        exit(0);
    }

    void *thread1(void *junk)
    {
        for(i=1;i<=9;i++)
        {
            pthread_mutex_lock(&mutex);/*
    鎖住互斥量*/
            if(i%3==0)
                 pthread_cond_signal(&cond);/*
    條件改變,發送信號,通知t_b進程*/
            else       
                 printf("thead1:%d\n",i);
            pthread_mutex_unlock(&mutex);/*
    解鎖互斥量*/

    sleep(1);
    }

    }

    void *thread2(void *junk)
    {
        while(i<9)
        {
            pthread_mutex_lock(&mutex);

    if(i%3!=0)
                pthread_cond_wait(&cond,&mutex);/*
    等待*/
            printf("thread2:%d\n",i);
            pthread_mutex_unlock(&mutex);

    sleep(1);
    }

    }

    程序創建了2個新線程使他們同步運行,實現進程t_b打印20以內3的倍數,t_a打印其他的數,程序開始線程t_b不滿足條件等待,線程t_a運行使a循環加1并打印。直到i3的倍數時,線程t_a發送信號通知進程t_b,這時t_b滿足條件,打印i值。

    下面是運行結果:

    #cc –lpthread –o cond cond.c

    #./cond

    thread1:1

    thread1:2

    thread2:3

    thread1:4

    thread1:5

    thread2:6

    thread1:7

    thread1:8

    thread2:9


    文章來源:http://blog.163.com/ccbobo_cat/blog/static/3209946220095235658763
    posted on 2009-06-23 17:07 C.B.K 閱讀(292) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 国产一区视频在线免费观看| 男人的好免费观看在线视频| 亚洲精品9999久久久久无码| 久久久久久精品成人免费图片| 亚洲成?Ⅴ人在线观看无码| 亚洲av最新在线观看网址| 大香人蕉免费视频75| 亚洲av成本人无码网站| 日本免费大黄在线观看| 亚洲一级二级三级不卡| 亚洲av成人一区二区三区观看在线 | 成年性羞羞视频免费观看无限| 亚洲一级片内射网站在线观看| 1区1区3区4区产品亚洲| 亚洲精品免费在线| 亚洲AV无码无限在线观看不卡| 日韩一级视频免费观看| 最新亚洲人成网站在线观看| 无码国产精品一区二区免费式直播 | 爱情岛论坛免费视频| 国产午夜亚洲精品理论片不卡| 中国内地毛片免费高清| 亚洲影院在线观看| 久久精品网站免费观看| 精品亚洲成a人在线观看| 国产亚洲午夜高清国产拍精品 | 久久亚洲美女精品国产精品 | 亚洲精品无码AV中文字幕电影网站| 国产VA免费精品高清在线| 久久精品国产亚洲| 成人免费毛片内射美女APP| 黄色网址免费在线| 亚洲精品美女久久久久99| 69视频免费在线观看| 亚洲国产精品无码观看久久| 亚洲综合另类小说色区色噜噜| 久久99国产乱子伦精品免费| 亚洲成aⅴ人片久青草影院按摩| 久久久久国产亚洲AV麻豆| 天天影院成人免费观看| 黄床大片30分钟免费看|