生产消费者(CP)模型

CP模型有三个部分:productor和consumer(由线程组成的功能块)还有一个特定结构的内存空间

以超市为例,超市货物由供应商提供,超市暂时存储货物,消费者可以在超市购买货物。

工作流程;生产者获取数据,生产任务并将任务放到仓库,消费者从仓库获取任务,处理任务


“321”原则

三种关系:

生产者和生产者之间的关系:互斥

消费者和消费者之间的关系:互斥

生产者和消费者之间的关系:互斥,同步(必须生产者生产之后,消费者才能消费,要有顺序)

二种角色:生产和消费

一个交易所:特定的内存结构空间


优点:

1.支持忙闲不均,如果仓库为满,生产者可以不生产一段时间,消费者可以一直消费

2.生产和消费解耦合,因为有仓库作缓冲

3.提高效率:在生产者获取数据和生产任务的时候,消费者可以处理数据,二者可以同时进行;生产者和消费者是多线程,多个线程同时完成获取数据和处理任务的工作。


代码模拟:

//block_queue.hpp
#include <queue>
#include <mutex>
#include <condition_variable>

#define MAX_CAPACITY 100
template <class T>
class blockqueue
{
public:
    std::queue<T> q;
    int max_capcity = MAX_CAPACITY; // 最大存储数量
    std::mutex pmut;                // 生产者锁
    std::mutex cmut;                // 消费者锁
    std::condition_variable pcon;
    std::condition_variable ccon;
    blockqueue()
    {
    }
    ~blockqueue()
    {
    }

    void push(T &task);
    void pop();
    bool empty();
    size_t size();
    T front();
};

template<class T>
void blockqueue<T>::push(T &task)
{
    q.push(task);
}

template<class T>
void blockqueue<T>::pop()
{
    q.pop();
}

template<class T>
bool blockqueue<T>::empty()
{
    return q.empty();
}

template<class T>
size_t blockqueue<T>::size()
{
    return q.size();
}

template<class T>
T blockqueue<T>::front()
{
    return q.front();
}
//main.cpp
#include <iostream>
#include <ctime>
#include <thread>
#include <unistd.h>
#include "block_queue.hpp"

using namespace std;

void product(blockqueue<string> &bq)
{
    unique_lock<mutex> ul(bq.pmut);
    while (1)
    {
        //获取数据
        int n = rand() % 10000;
        cout << "获取数据:" << to_string(n) << endl;
        sleep(1);
        while (bq.size() >= bq.max_capcity)
        {
            // 不使用if,因为可能造成伪唤醒
            cout << "任务已满,等待" << endl;
            bq.pcon.wait(ul);
        }
        cout << "生成任务" << endl;
        string name = "task" + to_string(n);
        bq.push(name);
        bq.ccon.notify_all();
        sleep(1);
    }
}

void consume(blockqueue<string> &bq)
{
    unique_lock<mutex> ul(bq.cmut);
    while (1)
    {
        while (bq.empty())
        {
            cout << "没有任务,等待" << endl;
            bq.ccon.wait(ul);
        }
        //获取任务
        string name = bq.front();
        cout << "get " << name << endl;
        bq.pop();
        bq.pcon.notify_all();
        //sleep(1);
        //处理任务
        cout << "处理数据中。。。" << endl; 
        //sleep(1);
    }
}

int main()
{
    srand(time(nullptr));
    blockqueue<string> bq;
    //生产者消费者都可以由多个线程组成
    thread p[10];
    for(auto& e:p)
    {
        e = thread(product, ref(bq));
    }
    thread c[5];
    for(auto& e:c)
    {
        e = thread(consume, ref(bq));
    }
    
    sleep(1);
    for(auto& e:p)
    {
        e.join();
    }
    for(auto& e:c)
    {
        e.join();
    }
    

    return 0;
} 

blockqueue<string>对象bq需要在多个线程之间共享,并且需要通过引用传递。使用std::ref可以确保这一点

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: LSCP模型和MCLP模型都是解决最优化问题的模型。 LSCP模型(Location Set Covering Problem)是一种经典的组合优化问题,目标是找到最少数量的集合,使得这些集合的并集包含了全部的元素。这个问题被广泛应用于公共设施选址、货物配送等领域。 MCLP模型(Maximal Covering Location Problem)也是一个组合优化问题,目标是在给定数量的服务设施中选出一部分,使得服务范围内的需求点覆盖率最大。这个问题常用于公共交通站点规划、医疗设施布局等领域。 两个模型都是通过确定最优的集合组合来达到最优化的目的,但是LSCP模型强调了覆盖全部元素,而MCLP模型则强调了覆盖最大需求点。 ### 回答2: LSCP(Large-scale Connected Facility Location Problem)模型和MCLP(Maximal Covering Location Problem)模型是两种常见的设施选址问题模型。 LSCP模型是一种大规模连通设施选址问题模型。该模型是在一定的区域内选择设施的位置,以便为尽量多的需求点提供服务,并确保设施之间的连通性。LSCP模型通常用于交通规划、电力供应等领域。其目标是最大化被服务需求点的覆盖率,同时确保设施之间的连通性,从而达到最优的设施选址方案。 MCLP模型是一种最大覆盖设施选址问题模型。该模型的目标是选择最少数量的设施位置,以覆盖尽量多的需求点。MCLP模型应用广泛,常用于对应急服务、快递配送等场景的设施选址优化。通过选择最佳的设施位置,可以最大程度地覆盖到需求点,并优化服务的质量和效率。 这两个模型都可以通过数学建模和优化算法进行求解。其中,LSCP模型常用的解法有最小费用流模型、整数规划等,MCLP模型常用的解法有贪心算法、整数规划等。根据实际情况和约束条件,可以选择合适的模型来解决设施选址问题,并得到最优的选址方案。 ### 回答3: LSCP(Large-scale Set Covering Problem)模型和MCLP(Maximum Covering Location Problem)模型是运筹学领域中的两个重要问题。 LSCP模型是指在一组包含多个元素的集合中,如何以最小的成本选择一组集合,使得它们的并集包含了指定的元素。这个问题通常用于优化选择问题,例如如何选择广告投放的位置或者选择设立配送中心的位置。LSCP模型的目标是选择覆盖所有需求点的最少集合,并且可以通过对集合进行加权以考虑不同集合的重要性。 MCLP模型是指在一个有限的地理区域内,如何选择若干个合适的位置,以最大化覆盖这个区域内的需求点数量。这个问题常用于市场分析、区域规划和设施布局等领域中。MCLP模型的目标是在考虑到位置选择的成本和覆盖范围的限制的条件下,找到最佳的位置组合,使得覆盖的需求点数量最大化。 LSCP和MCLP模型作为经典的运筹学问题,都属于NP困难问题,即没有高效的算法能够在多项式时间内求解最优解。因此,求解这些问题往往需要利用启发式算法、近似算法或者整数规划等方法进行求解。 总之,LSCP和MCLP模型分别用于解决集合覆盖和最大覆盖问题,目标都是在特定的约束条件下选择最优的集合或位置组合。这两个模型在现实生活中有着广泛的应用,能够帮助决策者做出有效的决策。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值