单生产者多消费者-生产消费者模型 #include <QtCore/QCoreApplication>
#include <QSemaphore>
#include <QThread>
#include <QMutex>
#include <iostream>
using namespace std;
QSemaphore vacancy(5); //空位资源
QSemaphore produce(0); //产品数量
QMutex mutex; //互斥锁
int buffer[5]; //缓冲区可以放5个产品
int numtaken=60;
int takei=0;
class Producer:public QThread
{
public:
void run();
};
void Producer::run() //生产者线程
{
for(int i=0;i<60;i++) //生产60次产品
{
vacancy.acquire(); //P(s1)操作原语
buffer[i%5]=i;
printf("produced %d\n",i);
produce.release(); //V(s2)操作原语
}
}
class Consumer:public QThread
{
public:
void run();
};
void Consumer::run() //消费者线程
{
while(numtaken>1)
{
produce.acquire(); //P(s2)操作原语
mutex.lock(); //从缓冲区取出一个产品...多个消费者,不能同时取出,故用了互斥锁
printf("thread %ul take %d from buffer[%d] \n",currentThreadId(),buffer[takei%5],takei%5);
takei++;
numtaken--;
mutex.unlock();
vacancy.release(); //V(s1)操作原语
}
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Producer producer;
Consumer consumerA;
Consumer consumerB;
producer.start();
consumerA.start();
consumerB.start();
producer.wait();
consumerA.wait();
consumerB.wait();
return 0;
}