生产者消费者模型
这是多线程并发里面一个经典的案例,需要运用锁、多线程、信号量等等,非常基础,但是也非常关键。
生产者的职责:向一个缓冲区里不断存放数据
消费者的职责:向缓冲区里不断拿出数据
需要注意,生产者和消费者是需要隔离的,这里是指对于buffer的操作是隔离的,不然在多线程会出现问题。
定义变量
queue<int> buffer;
int max_buffer_size = 64;
bool producer_flag = true; //生产者
int max_producer_size = 100; //生产者拥有的所有生产能力
bool consumer_flag = true; //消费者
mutex mutexLock{}; //锁
condition_variable condition{}; //条件变量
生产者
void producer(){
int produce_num = 0;
while(producer_flag){
unique_lock<mutex> lockGuard(mutexLock);//调用时上锁
while(buffer.size() >= max_buffer_size) condition.wait(lockGuard);
while(produce_num < max_buffer_size) buffer.emplace(1);
++produce_num;
if(produce_num > max_producer_size){
producer_flag = false;
}
lockGuard.unlock(); //解锁
condition.notify_all(); //唤醒其他线程
}
}
消费者
void consumer(){
while(consumer_flag){
unique_lock<mutex> lockGuard(mutexLock);
while(buffer.empty()) condition.wait(lockGuard);
buffer.pop();
if(consumer_flag && buffer.empty()) consumer_flag =false;
lockGuard.unlock(); //解锁
condition.notify_all(); //唤醒其他线程
}
}