最良の生産者消費者案
#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;
};
この実装の利点は、モニタ反発体上で発生する競合を最小限に抑えることである.
度:書き込み者が1人の読み取り者を起動するたびに、複数の読み取り者が同時にロックを試みることはありません.
反発体を止める場合.また、モニタのnotifyは、反発体のロックを解除した場合のみ
待機中のスレッドに信号が送信されます.これは、スレッドがwaitから目が覚めると、
反発体を再取得しようとすると、反発体はロックされていない可能性が高い.これはその後の体操を
ロックされていない反発体を取得すると、通常非常に効率的になり、スレッドがロックされているため、より効率的になります.
スレッドコンテキストの切り替えが必要なため、反発体上のスリープは高価です.