最良の生産者消費者案

1339 ワード


#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から目が覚めると、
反発体を再取得しようとすると、反発体はロックされていない可能性が高い.これはその後の体操を
ロックされていない反発体を取得すると、通常非常に効率的になり、スレッドがロックされているため、より効率的になります.
スレッドコンテキストの切り替えが必要なため、反発体上のスリープは高価です.