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