首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

最优的生产者消费者议案

2012-11-05 
最优的生产者消费者方案#includeIceUtil/Monitor.htemplateclassTclassQueue:publicIceUtil::Monitor

最优的生产者消费者方案

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


热点排行