Linux——線程 五 (條件變量)

條件變量:
當一個線程互斥的訪問某個變量時,它可能會發現自己要完成某個操作需要某個共享變量達到條件。否則會進入阻塞。(就比如說,當前有個判斷 : a = 0 ,線程1要執行1/a,需要的條件是a不等於0,現在線程1只能阻塞等待着a變量的改變。
這時需要通過線程2去改變共享變量a的值)

我們先看一下條件變量的API:

條件變量: 
1.定義條件變量:pthread_cond_t cond;

2.初始化:pthread_cond_init(&cond,NULL)

3.等待條件 pthread_cond_wait(&cond,&mutex)
(1)mutex:如果沒有在互斥環境,形同虛設
(2)如果在,wait函數將mutex置成1,wait返回後,將mutex恢復成原來值

4.修改條件 pthread_cond_signal(&cond)

5.銷燬條件變量 pthread_cond_destroy(&cond)

我們可以看到等待條件變量的函數中有互斥量:
等待條件
pthread_cond_wait(&cond,&mutex)
(1)mutex:如果沒有在互斥環境,形同虛設
(2)如果在,wait函數將mutex置成1,wait返回後,將mutex恢復成原來值

爲什麼會有互斥量呢?
條件變量的條件滿足肯定牽扯到共享數據的修改,所以一定要加互斥鎖來保護。沒有互斥鎖就無法安全的獲取和修改共享數據。
設計模型應該如下:

pthread_mutex_lock()
while(條件不滿足)    //while是因爲pthread_cond_wait可能是因爲被信號打斷而喚醒
pthread_cond_wait()   
pthread_mutex_unlock()


pthread_mutex_lock()
pthread_cond_signal()  //如果沒有線程等待,信號被丟掉
pthread_mutex_unlock()

例子:

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


pthread_cond_t cond;
pthread_mutex_t mutex;

void *rout1(void *arg)
{
    while(1)
pthread_mutex_t mutex;

void *rout1(void *arg)
{
    while(1)
    {
        pthread_cond_wait(&cond,&mutex);
        printf("1 在運行 ...\n");
    }
}


void *rout2(void *arg)
{
    while(1)
    {
        pthread_cond_signal(&cond);
        //printf("發出信號,告訴線程1條件滿足!!\n");
        sleep(4);
    }
}


int main()
{
    pthread_cond_init(&cond,NULL);
    pthread_mutex_init(&mutex,NULL);


    pthread_t tid1,tid2;

    pthread_create(&tid1,NULL,rout1,NULL);
    pthread_create(&tid2,NULL,rout2,NULL);

    pthread_join(tid1,NULL);
    pthread_join(tid2,NULL);

    pthread_mutex_destroy(&mutex);
    pthread_cond_destroy(&cond);

    return 0;
}

運行結果:
這裏寫圖片描述

只有通過其他線程改變了條件,併發出了信號。在等待的線程條件滿足,才能繼續執行。

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