生产/消费者模型的实现 —— InfoQueue

   生产-消费者模型是多线程编程中的基本模型也是运用最多的模型,而它的原理就是一个线程向缓冲池中扔东西,另一个线程从缓冲池中把东西拿走.所以在这个模型中缓冲池是一个核心,它是生产-消费者之间的桥梁并且能进行一些控制.池满了则生产者必须等待,池空了则消费者必须等待.这里的关键就是缓冲池必须是固定大小不能随意扩充,因为程序一瞬间就能把堆耗尽.就是好比我们去蛋糕店买蛋糕,柜台和货架就是缓冲池糕点师是不能无限制的做蛋糕.所以缓冲池的最大,最小值(不一定为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();
        }

}
下篇文章我将展示如何使用它构造一个对象池.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值