操作系统里的生产者、消费者问题
2011-11-15 19:33
393 查看
前段时间网上有一个人让我帮他改个程序,操作系统里面生产者与消费者的那个程序,写的一片混乱,改了好长时间。。。。很弱智。
#include <stdlib.h> #include <iostream> #include <windows.h> #include <string> #include <ctime> using namespace std; #define BUFFER_NUM 6 int product[BUFFER_NUM][2]; HANDLE g_semBuffer,g_semProduct,g_mutex; // 消费者线程 DWORD WINAPI Consumer(LPVOID para) { while(1) { srand((unsigned)time(NULL)); Sleep(rand()%1000+1000); WaitForSingleObject(g_semProduct,INFINITE);//等商品区是否有商品,如果有,减1 WaitForSingleObject(g_mutex,INFINITE);//获取对互斥资源的操作权限 int index; for (index = 0; index < BUFFER_NUM; index ++) { if (product[index][1] != 0)//找到了这个位置的商品没有被购买 于是跳出购买 break; } cout<<"消费者购买了商品"<<product[index][0]<<endl; product[index][1] = 0;//购买后将购买标志置0,表示这个位置没有商品了 可以放生产的商品 ReleaseMutex(g_mutex); ReleaseSemaphore(g_semBuffer,1,NULL);//空闲区位置加1 } return 0; } // 生产者线程 DWORD WINAPI Producer(LPVOID para) { while(1) { srand((unsigned)time(NULL)); Sleep(rand()%1000 + 2000); int data = rand()%30;//生产的商品 用数字代表 WaitForSingleObject(g_semBuffer,INFINITE);//等有空闲的位置,空闲区位置减1 WaitForSingleObject(g_mutex,INFINITE);//等对互斥资源的操作权限 int ix; for (ix = 0; ix < BUFFER_NUM; ix ++) { if (product[ix][1] == 0)//找到一个可以放商品的位置 break; } product[ix][0] = data;//把生产出的商品放到找到的位置 product[ix][1] = 1;//标识这个位置上有商品 cout<<" 生产者生产了商品"<<data<<endl; ReleaseMutex(g_mutex);//释放权限 ReleaseSemaphore(g_semProduct,1,NULL);//商品区数量加1 } return 0; } int main() { cout<<endl<<"***********输出间隔不等,请耐心等待不要关闭!***********"<<endl<<endl; for (int i = 0; i < BUFFER_NUM; i ++) product[i][0] = i + 1; for (int j = 0; j < BUFFER_NUM; j ++) product[j][1] = 1; //初始时每个位子都有商品 因此 一开始肯定消费商品 g_mutex = CreateMutex(NULL,FALSE,NULL); g_semBuffer = CreateSemaphore(NULL,0,BUFFER_NUM,NULL);//初始时空闲区最少 为0 g_semProduct = CreateSemaphore(NULL,BUFFER_NUM,BUFFER_NUM,NULL);//商品区最大 为BUFFER_NUM if(!g_semBuffer||!g_mutex) { cout<<"Create Semaphore Error!\n"; return -1; } HANDLE h[2]; DWORD consumerID,productID; h[0] = ::CreateThread(NULL,0,Consumer,NULL,0,&consumerID); h[1] = ::CreateThread(NULL,0,Producer,NULL,0,&productID); WaitForMultipleObjects(2,h,TRUE,INFINITE); ::CloseHandle(h[0]); ::CloseHandle(h[1]); return 0; }
相关文章推荐
- 操作系统生产者/消费者问题(二)
- 操作系统--生产者消费者问题
- 操作系统:生产者消费者问题
- 操作系统经典同步互斥问题——生产者消费者问题
- 【操作系统】学习笔记(二)之生产者消费者问题
- 操作系统中生产者/消费者问题(一)
- Linux下生产者消费者问题详细分析(操作系统期中考试论文---并发程序的同步和互斥)
- 操作系统 简单的单生产者单消费者问题
- 操作系统:生产者-消费者问题
- 操作系统中生产者/消费者问题(一)
- 生产者和消费者问题c++(操作系统)
- 【操作系统】信号量 (生产者与消费者问题)
- 东北大学操作系统实验:进程同步和通信(生产者消费者问题模拟)
- 操作系统学习笔记-信号量及PV操作与进程互斥和消费者生产者问题
- 操作系统课程设计消费者和生产者问题源码解析
- 操作系统 带有缓冲机制的生产者消费者问题
- 操作系统的一个经典问题 -- "生产者-消费者"问题
- 【操作系统】经典教程同步问题 ---- 生产者和消费者
- 操作系统:经典进程同步问题(1)生产者-消费者问题
- 生产者-消费者问题(操作系统)原理与实现