`
monkeycn
  • 浏览: 42772 次
  • 性别: 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中醒来、
重新尝试获取互斥体时,互斥体很可能处在未加锁状态。这会使随后的操
作更高效,因为获取未加锁的互斥体通常会非常高效,而强迫线程在锁住
的互斥体上休眠很昂贵(因为必须进行线程上下文切换) 。


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics