條件變量:
當一個線程互斥的訪問某個變量時,它可能會發現自己要完成某個操作需要某個共享變量達到條件。否則會進入阻塞。(就比如說,當前有個判斷 : 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;
}
運行結果:
只有通過其他線程改變了條件,併發出了信號。在等待的線程條件滿足,才能繼續執行。