`
monkeycn
  • 浏览: 43783 次
  • 性别: Icon_minigender_1
  • 来自: 福州
文章分类
社区版块
存档分类
最新评论

最优的生产者消费者方案

阅读更多
#include<IceUtil/Monitor.h>
template<classT>classQueue
:publicIceUtil::Monitor<IceUtil::Mutex>{
public:
    Queue():_waitingReaders(0){}
    voidput(constT&item){
        IceUtil::Monitor<IceUtil::Mutex>::Locklock(*this);
        _q.push_back(item);
        if(_waitingReaders)
            notify();
    }
    Tget(){
        IceUtil::Monitor<IceUtil::Mutex>::Locklock(*this);
        while(_q.size()==0){
            try{
                ++_waitingReaders;
                wait();
                --_waitingReaders;
            }catch(...){
                --_waitingReaders;
                throw;
            }
        }
        Titem=_q.front();
        _q.pop_front();
        returnitem;
    }
private:
    list<T>_q;
    short_waitingReaders;
};



这种实现的优点是,它使发生在监控器互斥体之上的竞争降到了最低限
度:写入者每次都唤醒一个读取者,所以不会发生多个读取者同时尝试锁
住互斥体的情况。而且,监控器的 notify 只有在解除了互斥体的加锁之
后,才会向等待中的线程发出信号。这意味着,当线程从 wait中醒来、
重新尝试获取互斥体时,互斥体很可能处在未加锁状态。这会使随后的操
作更高效,因为获取未加锁的互斥体通常会非常高效,而强迫线程在锁住
的互斥体上休眠很昂贵(因为必须进行线程上下文切换) 。


分享到:
评论

相关推荐

    生产者消费者问题

    生产者消费者问题解决方案 生产者消费者问题是计算机科学中的一种经典问题,描述的是在多线程环境中,多个生产者线程和消费者线程之间的协作问题。生产者线程负责生产数据,并将其存储在缓冲区中,而消费者线程则从...

    生产者消费者架构的串口高速数据采集.rar_greatervgw_labview_串口_串口 消费者_生产者消费者

    总之,"生产者消费者架构的串口高速数据采集.vi"是一个利用LabVIEW实现的高效数据处理方案,通过串口通信获取数据,并利用生产者消费者模型保证数据处理的流畅性和稳定性。了解并掌握这一模型对于提升LabVIEW程序的...

    生产者消费者代码(C++版)

    文件名`producer-consumer`很可能包含了实现这些逻辑的源代码文件,如`producer.cpp`和`consumer.cpp`,以及可能的主程序文件`main.cpp`,它们共同构成了完整的生产者-消费者问题的C++解决方案。 这个示例不仅展示...

    多线程简易实现生产者消费者模式

    生产者消费者模式是一种经典的多线程同步问题解决方案,它源于现实世界中的生产流水线,用于描述生产者(Producer)和消费者(Consumer)之间的协作关系。在这个模式中,生产者负责生成产品并放入仓库,而消费者则从...

    操作系统实验报告经典的生产者—消费者问题.pdf

    他们之间也存在互斥,即生产者消费者必须互斥访问缓冲池,即不能有两个以上的进程同时进展。 在本实验中,我们使用C#语言在Windows操作系统环境下实现了生产者和消费者的模拟。在实验中,我们使用了两个线程,一个...

    利用记录型信号量解决生产者-消费者问题.doc

    解决生产者-消费者问题的记录型信号量方法是一种简单而有效的解决方案。通过使用记录型信号量,我们可以实现生产者和消费者的同步,从而确保数据的正确性和完整性。这一方法广泛应用于操作系统、数据库系统和其他...

    利用数组解决生产者消费者问题

    虽然这个实现并不涉及多线程,但它提供了一个直观的理解,展示了生产者消费者问题的基本概念和解决方案。在实际的多线程环境中,可能需要使用如`pthread`库中的互斥锁和条件变量等工具来实现更为精确的同步。

    Qt入门练习项目——生产者消费者模型.zip

    在编程领域,生产者消费者模型是一种常见的多线程同步问题的解决方案。这个模型通常用于处理数据流的异步处理,其中一个或多个线程(生产者)生成数据,而其他线程(消费者)则负责处理这些数据。在Qt框架中,我们...

    生产者消费者问题C#

    生产者消费者问题是多线程编程中的一个经典案例,它展示了如何通过线程间的协作来解决资源的并发访问问题。在C#中,我们可以利用System.Threading命名空间提供的工具来实现这一模型。下面将详细阐述这个问题的背景、...

    生产者消费者问题 进程实现

    生产者消费者问题进程实现 在计算机科学中,生产者消费者问题(Producer-Consumer problem)是操作系统中的一种典型问题。...这个程序展示了生产者消费者问题的解决方案,并展示了多进程编程和信号量的使用。

    实验一 生产者消费者问题

    在C++的生产者消费者问题解决方案中,通常会使用一个缓冲区来存储待消费的数据。这个缓冲区是共享资源,因此需要使用互斥量保护。生产者在缓冲区未满时才能生产数据并放入缓冲区,消费者在缓冲区非空时才能取出数据...

    生产者消费者问题 MFC

    生产者消费者问题的解决方案通常涉及以下关键组件: 1. **共享缓冲区**:这是生产者和消费者之间共享的数据结构,用于存储待消费的产品。在MFC中,可以使用`CArray`、`CList`或`CMap`等容器类来实现。 2. **同步...

    利用管程_信号量解决生产者消费者问题

    ### 利用管程与信号量解决生产者消费者问题 #### 概述 生产者-消费者问题是计算机科学中一个经典的问题,它用于演示进程间通信和同步的基本概念。该问题通常涉及一组生产者进程(负责生成数据)和一组消费者进程...

    jchc.rar_tearshmj_生产者_生产者-消费者问题 c++ _生产者和消费者_生产者消费者

    总的来说,这个项目提供了一个直观的、基于C++的生产者-消费者问题解决方案,通过实际的多线程操作展示了并发编程中的核心概念。学习并理解这个项目,不仅可以加深对线程同步和互斥的理解,也为解决更复杂的并发问题...

    生产者消费者源码

    在计算机科学中,"生产者消费者问题"是一个经典的多线程同步问题,它涉及到如何在多个线程之间共享资源并确保数据的...在Windows环境下,利用C语言和Windows API,我们可以构建出高效且稳定的生产者消费者解决方案。

    生产者 消费者 进程 可视化 java

    总结来说,这个程序设计了一个基于Java的生产者-消费者问题的可视化解决方案,利用多线程和进程同步机制来模拟车库(缓冲区)中数据的生产与消耗过程。通过图形用户界面,用户可以直观地看到生产者和消费者如何在...

    C语言编程模拟生产者和消费者问题.pdf

    生产者和消费者问题的解决方案需要使用PV操作来实现同步,以避免生产者和消费者之间的冲突。 实验目的和要求是模拟实现用同步机构避免发生进程执行时可能出现的与时间有关的错误。实验环境是Windows操作系统和...

    用多线程同步方法解决生产者-消费者问题(操作系统课设

    我们的解决方案使用了信号量来控制生产者和消费者的访问顺序,确保缓冲区的安全和一致性。 我们的解决方案包括以下几个部分: 1. 缓冲区的实现:我们使用数组实现了缓冲区,缓冲区的大小是有限的。 2. 信号量的...

    PV操作实现生产者消费者问题

    PV操作可以用来实现生产者消费者问题的解决方案。产生者进程和消费者进程之间可以通过PV操作来实现同步和互斥。例如,在一个生产者和一个消费者之间的缓冲区,可以使用PV操作来实现生产者进程和消费者进程之间的同步...

    操作系统 生产者消费者问题实验代码和报告

    操作系统中的“生产者-消费者问题”是一个经典的多线程同步问题,它源于现实生活中的生产流水线,用于模拟两个或多个不同步操作之间的交互。在这个问题中,“生产者”负责生成资源(例如产品),而“消费者”则负责...

Global site tag (gtag.js) - Google Analytics