zoukankan      html  css  js  c++  java
  • 生产者消费者模式(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;
    }
  • 相关阅读:
    IT零起点转FICO学习路线
    Consuming a Web Service in ABAP
    SAP月末结账步骤
    sap dialog Screen Sequences
    ABAP:区别CALL SCREEN/SET SCREEN/LEAVE TO SCREEN
    查询abap 程式应用到系统表table
    SAP压缩excel并发送mail案例
    ABAP PARAMETERS 参数
    DQL、DML、DDL、DCL 概念与区别
    OLE Excel 、Word 转换 pdf 文件
  • 原文地址:https://www.cnblogs.com/yongjin-hou/p/15203891.html
Copyright © 2011-2022 走看看