ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[TOC] ## 条件变量 - 条件变量是一种相对复杂的线程同步方法 - 条件变量允许线程睡眠,直到满足某种条件 - 当满足条件时,可以向该线程信号,通知唤醒 ### 问题 - 缓冲区小于等于0时,不允许消费者消费,消费者必须等待 - 缓冲区满时,不允许生产者往缓冲区生产,生产者必须等待 - 当生产者生产个产品时,唤醒可能等待的消费者 - 当消费者消费一个产品时,唤醒可锵等待的生产者 ### api ``` pthread_cond_t pthread_cond_wait(等待条件满足) pthread_cond_notify(等待被唤醒) ``` ## 示例 <details> <summary>main.cpp</summary> ``` #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> #include <vector> 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 通知生产者... ... ``` </details> <br />