条件变量
最后更新于:2022-04-02 04:06:24
[TOC]
## 条件变量
- 条件变量是一种相对复杂的线程同步方法
- 条件变量允许线程睡眠,直到满足某种条件
- 当满足条件时,可以向该线程信号,通知唤醒
### 问题
- 缓冲区小于等于0时,不允许消费者消费,消费者必须等待
- 缓冲区满时,不允许生产者往缓冲区生产,生产者必须等待
- 当生产者生产个产品时,唤醒可能等待的消费者
- 当消费者消费一个产品时,唤醒可锵等待的生产者
### api
```
pthread_cond_t
pthread_cond_wait(等待条件满足)
pthread_cond_notify(等待被唤醒)
```
## 示例
#include
#include
#include
#include
int MAX_BUF = 100;
int num =0;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void *producer(void*){
while(true){
pthread_mutex_lock(&mutex);
while(num>=MAX_BUF){
// 等待
pthread_cond_wait(&cond,&mutex);
printf("缓冲区满了,等待消费者消费\n");
}
num++;
printf("生产一个产品,当前产品数量为: %d\n",num );
sleep(1);
pthread_cond_signal(&cond);
printf("通知消费者...\n");
pthread_mutex_unlock(&mutex);
sleep(1);
}
}
void *consumer(void*){
while(true){
pthread_mutex_lock(&mutex);
while(num<=0){
// 等待
pthread_cond_wait(&cond,&mutex);
printf("缓冲区空了,等待生成者生产..\n");
}
num--;
printf("消费一个产品,当前产品数量为: %d\n",num );
sleep(1);
pthread_cond_signal(&cond);
printf("通知生产者...\n");
pthread_mutex_unlock(&mutex);
}
}
int main(){
printf("stat in main function.");
pthread_t thread1,thread2;
pthread_create(&thread1,NULL,&producer,NULL);
pthread_create(&thread2,NULL,&consumer,NULL);
pthread_join(thread1,NULL);
pthread_join(thread2,NULL);
printf("print in main function:num=%d",num);
return 0;
}
```
编译并运行
```
> g++ main.cpp && time ./a.out
stat in main function.生产一个产品,当前产品数量为: 1
通知消费者...
消费一个产品,当前产品数量为: 0
通知生产者...
生产一个产品,当前产品数量为: 1
通知消费者...
缓冲区空了,等待生成者生产..
消费一个产品,当前产品数量为: 0
通知生产者...
...
```
';