#include <windows.h> #include <stdio.h> #include <iostream> bool g_continue=true; DWORD WINAPI Thread1(LPVOID lpPara); //线程1 DWORD WINAPI Thread2(LPVOID lpPara); //线程2 struct buffer { int bufferpd; //存放产品 bool bufferzt; //状态 }; HANDLE hmutex=CreateMutex(NULL,FALSE,"readcoutmtx"); HANDLE hfull=CreateSemaphore(NULL,0,10, "bufferfull"); HANDLE hempty=CreateSemaphore(NULL,10,10,"butterhempty"); int main() { HANDLE hThread1, hThread2; //两个线程的handle DWORD ThreadId1, ThreadId2; //两个线程的线程ID hThread1 = CreateThread(NULL,0,Thread1,NULL,0,&ThreadId1); //创建线程1 if(hThread1 == NULL) return -1; hThread2 = CreateThread(NULL,0,Thread2,NULL,0,&ThreadId2); //创建线程2 if(hThread2 == NULL) return -1; if(getchar()) //按回车后终止程序运行 g_continue = false; system("pause"); } //线程1执行的代码 buffer bf[10]; DWORD WINAPI Thread1(LPVOID lpPara) { int n=0,a=0; while(g_continue) { WaitForSingleObject(hempty,INFINITE); WaitForSingleObject(hmutex,INFINITE); bf[n].bufferzt=1; bf[n].bufferpd=++n; std::cout<<"生产者将产品"<<n<<"放入缓冲单元"<<n-1<<",缓冲队列当前状态为:"<<std::endl; std::cout<<"缓冲单元编号"<<" 产品编号"<<" 缓冲单元状态"<<std::endl; for(a=0;a<10;a++) std::cout<<" "<<a<<" "<<bf[a].bufferpd<<" "<<bf[a].bufferzt<<std::endl; n=n%10; Sleep(200); //睡眠,让出CPU使用权 ReleaseMutex(hmutex); ReleaseSemaphore(hfull,1,NULL); } return 0; } //线程2执行的代码 DWORD WINAPI Thread2(LPVOID lpPara) { int spend=0,a=0; while(g_continue) { WaitForSingleObject(hfull,INFINITE); WaitForSingleObject(hmutex,INFINITE); Sleep(200); //睡眠,让出CPU使用权 bf[spend].bufferpd=0; bf[spend].bufferzt=0; std::cout<<"消费者从冲单元"<<spend<<"将产品"<<spend+1<<"取出,缓冲队列当前状态为:"<<std::endl; std::cout<<"缓冲单元编号"<<" 产品编号"<<" 缓冲单元状态"<<std::endl; for(a=0;a<10;a++) std::cout<<" "<<a<<" "<<bf[a].bufferpd<<" "<<bf[a].bufferzt<<std::endl; spend=(spend+1)%10; ReleaseMutex(hmutex); ReleaseSemaphore(hempty,1,NULL); } return 0; }