生产者消费者模式(C++)

#include <iostream>
#include <queue>
#include <thread>
#include <mutex>
#include <unistd.h>
#include <condition_variable>
using namespace std;

#define MAXSIZE 20
mutex mtx;
condition_variable produce, consume;  
queue<int> q;     

void producer(int id) {
    while (true) {
        sleep(1);
        unique_lock<mutex> lck(mtx);  // 上锁
        while (q.size() == MAXSIZE) { // 队列满了
            produce.wait(lck);
        }
        q.push(id); // 生产
        consume.notify_all();  // 生产完一个,通知消费者继续消费                                 
        lck.unlock(); // 解锁
    }
}

void consumer() {
    while (true) {
        sleep(1);
        unique_lock<mutex> lck(mtx); // 上锁
        // 判断队列是否为空的时候,使用的是while(q.size()==0),而不是if(q.size()==0)
        // wait()从阻塞到返回,可能由于系统的不确定原因唤醒,即伪唤醒
        while (q.size() == 0) { // 队列为空
            // 消费完所有,调用wait函数会对lck进行解锁,让生产者继续生产
            // consume被唤醒后,会继续进行加锁
            consume.wait(lck);
        }
        q.pop(); // 消费
        produce.notify_all(); // 消费完一个,通知生产者继续生产                              
        lck.unlock(); // 解锁
    }
}

int main() {
    thread consumers[2], producers[2];

    for (int i = 0; i < 2; ++i) {
        producers[i] = thread(producer, i + 1);
        consumers[i] = thread(consumer);  
    }

    for (int i = 0; i < 2; ++i) {
        producers[i].join();
        consumers[i].join();
    }

    system("pause");
    return 0;
}

 

posted @ 2021-08-29 22:29  封狼居胥!  阅读(413)  评论(0编辑  收藏  举报