//在此声明环境变量:生产者消费者问题,只有一个个缓冲区(buffer),初始情况之下,只有一个缓冲区装有生产的物品 #include<iostream> #include<windows.h> using namespace std; HANDLE buffer1; HANDLE empty1; HANDLE full1; //当前商品为空 int buffer=0; DWORD WINAPI Produce(LPVOID lpParameter); DWORD WINAPI Comsume(LPVOID lpParameter); int main() { HANDLE hThread1; HANDLE hThread2; //有关于CreateSemaphore的参数我是不了解的,初始计数值必须为1 //初始化是只有一个缓冲区和一件商品 buffer1=CreateSemaphore(NULL, //安全属性 1, //初值,开始时可供使用的资源数 1, //最大资源数 NULL); //Semaphone名称 empty1=CreateSemaphore(NULL,1,1,NULL); full1=CreateSemaphore(NULL,0,1,NULL); hThread1=CreateThread(NULL,0,Produce,NULL,0,NULL); hThread2=CreateThread(NULL,0,Comsume,NULL,0,NULL); CloseHandle(hThread1); CloseHandle(hThread2); Sleep(900); return 0; } DWORD WINAPI Produce(LPVOID lpParameter) { while(true) { WaitForSingleObject(empty1,INFINITE);//判断缓冲区是否为空,如果不为空,应该马上结束子线程的调用 WaitForSingleObject(buffer1,INFINITE);//企图获得缓冲区的控制权进行生产,持续等待直到有信号 cout<<"获得当前缓冲区的操作控制,进行生产"<<endl; buffer++; cout<<"当前的消费品个数为"<<buffer<<endl; ReleaseSemaphore(buffer1,1,NULL); ReleaseSemaphore(full1,1,NULL); } return 0; } DWORD WINAPI Comsume(LPVOID lpParameter) { while(true) { WaitForSingleObject(full1,INFINITE); WaitForSingleObject(buffer1,INFINITE);//一直等待直到信号量有效,请求缓冲区的控制权 cout<<"获取当前缓冲区的操作控制,进行消费"<<endl; buffer--; cout<<"当前消费品的个数"<<buffer<<endl; ReleaseSemaphore(buffer1,// 1, NULL);// ReleaseSemaphore(empty1, 1,//信号量的当前资源数增加数量,与当前缓冲区的消费有关 NULL); } return 0; } /*从今天添加的全局变量来控制程序的执行,就可以看到自己对于信号量的不够深入了解。 信号量的请求次序是非常重要的,其实判断缓冲区是否已有物品已经在信号量中实现了 以下是有关信号量的特点和用途几句话: 1如果当前资源的数量大于0,则信号量有效 2如果当前资源数量是0,则信号量无效 3系统决不允许当前资源的数量为负值 当前资源数量绝对不能大于最大资源数量 */
int buffer=2;//当前商品为2/
/有关于CreateSemaphore的参数我是不了解的,初始计数值必须为1
buffer1=CreateSemaphore(NULL,1,1,NULL);
empty1=CreateSemaphore(NULL,2,1,NULL);//2代表的是缓冲区里面有两件商品
ull1=CreateSemaphore(NULL,1,1,NULL);//1代表的是缓冲区里面还可以继续生产
int buffer=2;//当前商品为2
因此我们需要非常注意缓冲区的消费品和信号量
时间: 2024-08-27 11:42:04