操作系统:18、线程同步之条件变量
条件变量
- 条件变量是一种相对复杂的线程同步方法
- 允许线程睡眠,直到满足某种条件
- 当条件满足时,可以向该线程信号,通知唤醒
生产者消费者代码实例:
#include <stdlib.h>
#include <stdio.h>
#include <vector>
#include <queue>
#include <unistd.h>
#include <pthread.h>
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 += 1;
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 -= 1;
pthread_cond_signal(&cond);
printf("通知生产者...\n");
printf("消费了一个产品,当前产品数量为:%d\n", num);
sleep(1);
pthread_mutex_unlock(&mutex);
}
}
int main(){
pthread_t thread1, thread2;
pthread_create(&thread1, NULL, &consumer, NULL);
pthread_create(&thread2, NULL, &producer, NULL);
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
return 0;
}