生产/消费者模型的实现 —— InfoQueue
2008-09-06 19:25:28 来源:WEB开发网生产-消费者模型是多线程编程中的基本模型也是运用最多的模型,而它的原理就是一个线程向缓冲池中扔东西,另一个线程从缓冲池中把东西拿走.所以在这个模型中缓冲池是一个核心,它是生产-消费者之间的桥梁并且能进行一些控制.池满了则生产者必须等待,池空了则消费者必须等待.这里的关键就是缓冲池必须是固定大小不能随意扩充,因为程序一瞬间就能把堆耗尽.就是好比我们去蛋糕店买蛋糕,柜台和货架就是缓冲池糕点师是不能无限制的做蛋糕.所以缓冲池的最大,最小值(不一定为0)就是临界条件.而在我前面的文章中提到了使用Event_Trigger(实际上Event_Trigger就是Semaphore,只不过我自己实现了一个Semaphore)来控制临界条件,而不是使用双重检测这种东西(当然不是说双重检测无用,只是应用面很小).我自己实现的锁Unique中使用了它(但没有用Event_Trigger来控制临界条件,在本文中将使用.).我喜欢用Queue来做缓冲池的载体,因为在某些应用中会要求先后顺序(FIFO).
public class Info_Queue<_Info>
下篇文章我将展示如何使用它构造一个对象池.
...{
Queue<_Info> _queue;
Event_Trigger _produce;
Event_Trigger _consume;
Unique _locker = new Unique();
public Info_Queue(int size)
...{
this._queue = new Queue<_Info>(size);
this._produce = new Event_Trigger(size);
this._consume = new Event_Trigger();
}
public void Push(_Info item)
...{
this._produce.Wait();
this._locker.Lock();
this._queue.Enqueue(item);
this._locker.UnLock();
this._consume.Post();
}
public _Info Pop()
...{
this._consume.Wait();
_Info item = default(_Info);
this._locker.Lock();
item = this._queue.Dequeue();
this._locker.UnLock();
this._produce.Post();
return item;
}
public int Count()
...{
return this._queue.Count;
}
public void Clear()
...{
this._queue.Clear();
this._locker.Close();
this._produce.Close();
this._consume.Close();
}
}
更多精彩
赞助商链接