https://www.jb51.cc/csharp/1193384.html

编程之家收集整理的这篇文章主要介绍了C++解决方法:多线程同步经典案例之生产者消费者问题编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

抄自维基百科 :

生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。该问题描述了共享固定大小缓冲区的两个线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。

解决该问题,就必须让生产者在缓冲区满时休眠(要么干脆就放弃数据),等到下次消费者消耗缓冲区中的数据的时候,生产者才能被唤醒,开始往缓冲区添加数据。同样,也可以让消费者在缓冲区空时进入休眠,等到生产者往缓冲区添加数据之后,再唤醒消费者。

本文用一个ItemRepository类表示产品仓库,其中包含一个数组和两个坐标表示的环形队列、一个std::mutex成员、用来保证每次只被一个线程读写操作 (为了保证打印出来的消息是一行一行的,在它空闲的时候也借用的这个互斥量╮(╯▽╰)╭)、两个std::condition_variable表示队列不满和不空的状态,进而保证生产的时候不满,消耗的时候不空。

    std::map<std::thread::id, int> threadPerformance;//records of every thread's producing/consuming number        std::condition_variable m_RepoUnfull;//indicating that this repository is unfull(then producers can produce items)        std::condition_variable m_RepoUnempty;//indicating that this repository is unempty(then consumers can produce items)while ((ir->m_ProducePos + 1) % gRepositorySize == ir->m_ConsumePos) {//full(spare one slot for indicating)            std::cout << "Repository is empty.Waiting for producing..." << std::endl;            std::this_thread::sleep_for(std::chrono::milliseconds(10));//sleep long enough in case it runs too fast for other threads to procude

相关文章

关于java生产者与消费者的实例详解

java多线程之并发协作生产者消费者设计模式

总结

以上是编程之家为你收集整理的C++解决方法:多线程同步经典案例之生产者消费者问题全部内容。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给好友。