#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中醒来、
重新尝试获取互斥体时,互斥体很可能处在未加锁状态。这会使随后的操
作更高效,因为获取未加锁的互斥体通常会非常高效,而强迫线程在锁住
的互斥体上休眠很昂贵(因为必须进行线程上下文切换) 。
本文介绍了一种使用IceUtil库实现的线程安全队列,该队列通过监控器和互斥锁确保了多线程环境下数据的一致性和安全性。文章详细解释了其工作原理,包括如何最小化互斥体竞争以及提高线程间通信效率。

被折叠的 条评论
为什么被折叠?



