简单的一个生产者和消费者

namespace CONSUMERPRODUCT{
 
struct Product{
    pthread_cond_t consumer_cond;
    pthread_cond_t producer_cond;
    pthread_mutex_t thread_mutex;
    int i_product = 0;
    const int MAX_PRODUCT = 20;
    const int MIN_PRODUCT = 0;
 
    void init()
    {
        pthread_cond_init(&consumer_cond, nullptr);
        pthread_cond_init(&producer_cond, nullptr);
        pthread_mutex_init(&thread_mutex, nullptr);
        i_product = 0;
    }
 
};
 
class Consumer{
public:
    explicit Consumer(Product &product)
        : _product(product)
    {
 
    }
 
    void start()
    {
        std::cout << "消费线程启动..." << std::endl;
 
        while(1)
        {
            pthread_mutex_lock(&_product.thread_mutex);
            if (_product.i_product <= _product.MIN_PRODUCT)
            {
                pthread_cond_wait(&_product.consumer_cond, &_product.thread_mutex);
            }
            _product.i_product--;
            std::cout << "消费一个产品 剩余: [" << _product.i_product << "] 产品" << std::endl;
            pthread_cond_signal(&_product.producer_cond);
            pthread_mutex_unlock(&_product.thread_mutex);
            std::this_thread::sleep_for(std::chrono::milliseconds(500));
        }
    }
 
private:
 
    Product &_product;
};
 
class Producer{
public:
    Producer(Product &product)
        : _product(product)
    {
 
    }
 
    void start()
    {
        std::cout << "生产线程启动..." << std::endl;
        while(1)
        {
            pthread_mutex_lock(&_product.thread_mutex);
            if (_product.i_product >= _product.MAX_PRODUCT)
            {
                pthread_cond_wait(&_product.producer_cond, &_product.thread_mutex);
            }
            _product.i_product++;
            std::cout << "生产一个产品 当前: [" << _product.i_product << "] 产品" << std::endl;
            pthread_mutex_unlock(&_product.thread_mutex);
 
            pthread_cond_signal(&_product.consumer_cond);
 
            std::this_thread::sleep_for(std::chrono::seconds(1));
        }
    }
 
 
private:
    Product &_product;
};
 
}
 
int main(int , char **)
{
    using namespace CONSUMERPRODUCT;
    Product product;
    product.init();
 
    Producer producer(product);
    std::thread p1(std::bind(&Producer::start, &producer));
    std::thread p2(std::bind(&Producer::start, &producer));
 
 
    Consumer consumer(product);
    std::thread c2(std::bind(&Consumer::start, &consumer));
 
    p1.join();
    p2.join();
    c2.join();
 
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值