• 生产者消费者模式(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;
    }
  • 相关阅读:
    Spring 注解详解01
    java 排序算法
    Java 文件拼接器
    oracle join
    Oracle 去重
    Java 笔试面试
    Oracle 笔试题02
    jvm性能查看常用命令
    关于对JMM(java内存模型)的个人理解
    RSA前端加密后端解密避免出现明文密码
  • 原文地址:https://www.cnblogs.com/yongjin-hou/p/15203891.html
Copyright © 2020-2023  润新知