生产者消费者完整代码

来源:互联网 发布:网络排名优化软件 编辑:程序博客网 时间:2024/05/16 11:24
#include <tchar.h>#include <windows.h>#include <iostream>using namespace std;#define SIZE_OF_BUFFER10 //缓冲区长度unsigned short ProductID = 0;//产品号unsigned short ConsumeID = 0;//将被消耗的产品号unsigned short index_in = 0;//产品进缓冲区时的缓冲区下标unsigned short index_out = 0;//产品出缓冲区时的缓冲区下标intg_buffer[SIZE_OF_BUFFER];   //缓冲区是个循环队列boolg_continue = true;//控制程序结束HANDLEg_hMutex;//用于线程间的互斥HANDLEg_hFullSemaphore;//当缓冲区满时迫使生产者等待HANDLEg_hEmptySemaphore;//当缓冲区空时迫使消费者等待DWORD WINAPI Producer(LPVOID);//生产者线程DWORD WINAPI Consumer(LPVOID);//消费者线程int _tmain(int argc, _TCHAR* argv[]){//创建各个互斥信号g_hMutex= CreateMutex(NULL, FALSE, NULL);g_hFullSemaphore= CreateSemaphore(NULL, SIZE_OF_BUFFER-1, SIZE_OF_BUFFER-1, NULL);g_hEmptySemaphore= CreateSemaphore(NULL, 0, SIZE_OF_BUFFER-1, NULL);//调整下面的数值,可以发现,当生产者个数多于消费者个数时,//生产速度快,生产者经常等待消费者;反之,消费者经常等待 const unsigned short PRODUCERS_COUNT = 1;  //生产者的个数const unsigned short CONSUMERS_COUNT = 2;  //消费者的个数//总的线程数const unsigned short THREADS_COUNT = PRODUCERS_COUNT+CONSUMERS_COUNT;HANDLE hThreads[PRODUCERS_COUNT];//各线程的handleDWORD producerID[CONSUMERS_COUNT];//生产者线程的标识符DWORD consumerID[THREADS_COUNT];//消费者线程的标识符int i;//创建生产者线程for (i = 0; i < PRODUCERS_COUNT; ++i){hThreads[i]= CreateThread(NULL, 0, Producer, NULL, 0, &producerID[i]);if(hThreads[i] == NULL) return -1;}//创建消费者线程for (i = 0; i < CONSUMERS_COUNT; ++i){hThreads[PRODUCERS_COUNT+i] = CreateThread(NULL, 0, Consumer, NULL, 0, &consumerID[i]);if(hThreads[i] == NULL) return -1;}while(g_continue){if(getchar()){ //按回车后终止程序运行g_continue = false;}}return 0;}//生产一个产品。简单模拟了一下,仅输出新产品的ID号void Produce(){cerr << "Producing " << ++ProductID << " ... ";cerr << "Succeed" << endl;}//把新生产的产品放入缓冲区void Append(){cerr << "Appending a product ... ";g_buffer[index_in] = ProductID;index_in = (index_in + 1) % SIZE_OF_BUFFER;cerr << "Succeed" << endl;//输出缓冲区当前的状态for (int i = 0; i < SIZE_OF_BUFFER; ++i){cout << i <<": " << g_buffer[i];if (i == index_in) cout << " <-- 生产";if (i == index_out) cout << " <-- 消费";cout << endl;}}//从缓冲区中取出一个产品void Take(){cerr << "Taking a product ... ";ConsumeID = g_buffer[index_out];index_out = (index_out+1) % SIZE_OF_BUFFER;cerr << "Succeed" << endl;//输出缓冲区当前的状态for (int i = 0; i < SIZE_OF_BUFFER; ++i){cout << i <<": " << g_buffer[i];if (i==index_in) cout << " <-- 生产";if (i==index_out) cout << " <-- 消费";cout << endl;}}//消耗一个产品void Consume(){cerr << "Consuming " << ConsumeID << " ... ";cerr << "Succeed" << endl;}//生产者DWORD  WINAPI Producer(LPVOID lpPara){while(g_continue){WaitForSingleObject(g_hFullSemaphore, INFINITE);WaitForSingleObject(g_hMutex, INFINITE);Produce();Append();Sleep(1500);ReleaseMutex(g_hMutex);ReleaseSemaphore(g_hEmptySemaphore, 1, NULL);}return 0;}//消费者DWORD  WINAPI Consumer(LPVOID lpPara){while(g_continue){WaitForSingleObject(g_hEmptySemaphore, INFINITE);WaitForSingleObject(g_hMutex, INFINITE);Take();Consume();Sleep(1500);ReleaseMutex(g_hMutex);ReleaseSemaphore(g_hFullSemaphore, 1, NULL);}return 0;}

原创粉丝点击