windows C++多线程(十一):生产者消费者模型

       说到多线程,有一个很经典的模型:生产者与消费者。例如一个仓库,假设装货量是一个常数N, 当前货物数为S, 把工厂当做生产者,销售是消费者。看下面几种情况:

  (1)0

  (2)S>N,停止生产,货物装不下了,可以销售

  (3)S=0,  无法销售,需要生产。

      生产者与消费者模型是“PV操作”的演化,在Windows多线程同步互斥是操作系统中的重点和难点。
      先讲讲PV操作的起源和用法。
      1962年,荷兰学者Dijksrta在参与X8计算机的开发中设计并实现了具有多道程序运行能力的操作系统——THE Multiprogramming System。为了解决这个操作系统中进程(线程)的同步与互斥问题,他巧妙地利用火车运行控制系统中的“信号灯”(semaphore,或叫“信号量”)概念加以解决。信号量的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。注意,这个信号量的值仅能由PV操作来改变。
       PV操作由P操作原语和V操作原语组成(原语也叫原子操作Atomic Operation,是不可中断的过程),对信号量(注意不要和Windows中的信号量机制相混淆)进行操作,具体定义如下:
P(S):
        ①将信号量S的值减1,即S=S-1;
        ②如果S>=0,则该进程继续执行;否则该进程置为等待状态。
V(S):
        ①将信号量S的值加1,即S=S+1;
        ②该进程继续执行;如果该信号的等待队列中有等待进程就唤醒一等待进程。
        用PV操作实现多线程的同步与互斥是非常简单的,只要考虑逻辑处理上合理严密而不用考虑具体技术细节,因此与写伪代码较为相似。

       下面用windows事件实现消费者与生产者模型:

#include 
#inclu

你可能感兴趣的:(C++多线程与线程池)