`

生产者消费者问题

阅读更多

#include <windows.h>

#include <iostream>

using namespace std;

 

const unsigned int bufferSize = 10; //缓冲区长度

unsigned int ProductID = 0;    //产品号

unsigned int ConsumeID = 0;    //将被消耗的产品号

unsigned int in = 0;      //产品进缓冲区时的缓冲区下标

unsigned int out = 0;      //产品出缓冲区时的缓冲区下标

 

bool ifContinue = true; //控制程序是否进行

 

int buffer[bufferSize];    //缓冲区

 

HANDLE Mutex;       //用于线程间的互斥

HANDLE FullSemaphore;     //当缓冲区满时迫使生产者等待

HANDLE EmptySemaphore;     //当缓冲区空时迫使消费者等待

 

DWORD WINAPI Producer(LPVOID);    //生产者线程

DWORD WINAPI Consumer(LPVOID);    //消费者线程

 

int main()

{

    //创建各个互斥信号量

    Mutex = CreateMutex(NULL,FALSE,NULL);

    FullSemaphore = CreateSemaphore(NULL,bufferSize-1,bufferSize-1,NULL);

    EmptySemaphore = CreateSemaphore(NULL,0,bufferSize-1,NULL);

 

 

    const unsigned short productors = 5; //生产者的个数

    const unsigned short consumers = 3; //消费者的个数

 

    //总的线程数

    const unsigned short threads = productors + consumers;

 

    HANDLE hThreads[productors]; //各线程的handle

    DWORD producerID[consumers]; //生产者线程的标识符

    DWORD consumerID[threads]; //消费者线程的标识符

 

    //创建生产者线程

    for (int i=0;i<productors;++i){

        hThreads[i]=CreateThread(NULL,0,Producer,NULL,0,&producerID[i]);

        if (hThreads[i]==NULL) return -1;

    }

    //创建消费者线程

    for (int i=0;i<consumers;++i){

        hThreads[productors+i]=CreateThread(NULL,0,Consumer,NULL,0,&consumerID[i]);

        if (hThreads[i]==NULL) return -1;

    }

   while(ifContinue){

        if(getchar()){ 

            ifContinue = false;

        }

    }

 

    return 0;

}

 

//输出当前缓冲区的信息

void outputBuffer(){

for (int i=0;i<bufferSize;++i){

        cout << i <<": " << buffer[i];

        if (i==in) cout << " <生产";

        if (i==out) cout << "<消费";

        cout << endl;

    }

}

//生产一个产品

void Produce()

{

    cout << "Producing " << ++ProductID << " ... ";

    cout << "Succeed" << endl;

}

 

 

 

 

//把新生产的产品放入缓冲区

void Add()

{

    cout << "Appending a product ... ";

    buffer[in] = ProductID;

    in = (in+1)%bufferSize;

    cout << "Succeed" << endl;

    outputBuffer();

}

 

 

//从缓冲区中取出一个产品

void Take()

{

    cout << "Taking a product ... ";

    ConsumeID = buffer[out];

    out = (out+1)%bufferSize;

    cout << "Succeed" << endl;

outputBuffer();

}

 

 

//消耗一个产品

void Consume()

{

    cout << "Consuming " << ConsumeID << " ... ";

    cout << "Succeed" << endl;

}

 

 

//生产者

DWORD WINAPI Producer(LPVOID lpPara)

{

    while(ifContinue){

        WaitForSingleObject(FullSemaphore,INFINITE);

        WaitForSingleObject(Mutex,INFINITE);

        Produce();

        Add();

        Sleep(1000);

        ReleaseMutex(Mutex);

        ReleaseSemaphore(EmptySemaphore,1,NULL);

    }

    return 0;

}

 

 

//消费者

DWORD WINAPI Consumer(LPVOID lpPara)

{

    while(ifContinue){

        WaitForSingleObject(EmptySemaphore,INFINITE);

        WaitForSingleObject(Mutex,INFINITE);

        Take();

        Consume();

        Sleep(1000);

        ReleaseMutex(Mutex);

        ReleaseSemaphore(FullSemaphore,1,NULL);

    }

    return 0;

}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics