WEB开发网
开发学院软件开发VC 生产/消费者模型的实现 —— InfoQueue 阅读

生产/消费者模型的实现 —— 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();
    }
}
下篇文章我将展示如何使用它构造一个对象池.

Tags:生产 消费者 模型

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接