HANDLE hThreads[PRODUCERS_COUNT];//各线程的 handle DWORD producerID[CONSUMERS_COUNT];//生产者线程的标识符 DWORD consumerID[THREADS_COUNT];//消费者线程的标识符 /*----------------------------程序提示信息开始------------------------------*/ void info()//程序提示信息 {
std::cout<<\
std::cout<<\课程设计课题 : 生产者-消费者问题的模拟实现 |\std::cout<<\指 导 老 师 : 李先锋 |\std::cout<<\学 生 : 丁可 |\std::cout<<\班 级 : B计123班 |\std::cout<<\std::cout<<\》按回车开始该程序 \getchar(); }
/*----------------------------程序提示信息结束------------------------------*/ /*----------------------------生产一个产品开始------------------------------*/ //生产一个产品:输出其 ID 号 void Produce() {
std::cout< std::cerr<<\生产一个产品: \std::cout< /*----------------------------生产一个产品结束------------------------------*/ /*----------------------把新生产的产品放入缓冲区开------------------------*/ //把新生产的产品放入缓冲区 void Append() { std::cerr<<\把生产的产品送入缓冲区\g_buffer[in]=ProductID; in=(in+1)%SIZE_OF_BUFFER; std::cerr< std::cout<<\缓冲区 产品 生产者/消费者\//新产品放入缓冲区后?输出缓冲区当前的状态 for(int i=0;i //输出缓冲区下标 if (i<10) std::cout< std::cout< { if(g_buffer[i]<10) std::cout<<\else std::cout<<\ std::cout<<\生产者\输出生产者的指针位置 } if(i==out) { if(g_buffer[i]<10) std::cout<<\else std::cout<<\ std::cout<<\消费者\输出消费者的指针位置 } std::cout< /*----------------------把新生产的产品放入缓冲区结------------------------*/ /*----------------------------消费一个产品开始------------------------------*/ void Consume()//消费一个产品 { std::cout< std::cerr<<\消费一个产品: \std::cout< /*----------------------------消费一个产品结束------------------------------*/ /*-----------------------从缓冲区中取出一个产品开始-------------------------*/ //从缓冲区中取出一个产品 void Take() { std::cout< std::cerr<<\从缓冲区取出一个产品\ConsumeID=g_buffer[out]; out=(out+1)%SIZE_OF_BUFFER; std::cerr< std::cout<<\缓冲区 产品 生产者/消费者\//取出一个产品后:输出缓冲区当前的状态 for(int i=0;i //输出缓冲区下标 if(i<10) std::cout< std::cout< if(i==in) { if(g_buffer[i]<10) std::cout<<\else std::cout<<\ std::cout<<\生产者\输出生产者的指针位置 } if(i==out) { if(g_buffer[i]<10) std::cout<<\else std::cout<<\ std::cout<<\消费者\输出消费者的指针位置 } std::cout< /*-----------------------从缓冲区中取出一个产品结束-------------------------*/ /*-----------------------------生产者线程开始-------------------------------*/ //生产者线程 DWORD WINAPI Producer(LPVOID lpPara) { while(g_continue) { //资源信号量的 P 操作 WaitForSingleObject(g_hFullSemaphore,INFINITE); //互斥信号量的 P 操作 WaitForSingleObject(g_hMutex,INFINITE); //生产一个产品 Produce(); //把新生产的产品放入缓冲区 Append(); Sleep(2000); //互斥信号量的 V 操作 ReleaseMutex(g_hMutex); //资源信号量的 V 操作 ReleaseSemaphore(g_hEmptySemaphore,1,NULL); } return 0; } /*-----------------------------生产者线程结束-------------------------------*/ /*-----------------------------消费者线程开始-------------------------------*/ //消费者线程 DWORD WINAPI Consumer(LPVOID lpPara) { while(g_continue) { //资源信号量的 P 操作 WaitForSingleObject(g_hEmptySemaphore,INFINITE); //互斥信号量的 P 操作 WaitForSingleObject(g_hMutex,INFINITE); //从缓冲区中取出一个产品 Take(); //消费一个产品 Consume(); Sleep(2000); //互斥信号量的 V 操作 ReleaseMutex(g_hMutex); //资源信号量的 V 操作 ReleaseSemaphore(g_hFullSemaphore,1,NULL); } return 0; } /*-----------------------------消费者线程结束-------------------------------*/ /*---------------------------创建生产者线程开始-----------------------------*/ void createPT()//创建生产者线程 { for(int i=0;i hThreads[i]=CreateThread(NULL,0,Producer,NULL,0,&producerID[i]); if(hThreads[i]==NULL) g_continue=0; } } /*---------------------------创建生产者线程结束-----------------------------*/ /*---------------------------创建消费者线程开始-----------------------------*/ void createCT()//创建消费者线程 { for (int j=0;j hThreads[PRODUCERS_COUNT+j]=CreateThread(NULL,0,Consumer,NULL,0,&consumerID[j]); if (hThreads[j]==NULL) g_continue=0; } } /*---------------------------创建消费者线程结束-----------------------------*/ /*-------------------------------主函数开始---------------------------------*/ int main() { //显示程序提示信息 info(); //创建互斥信号量 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); //创建生产者线程 createPT(); //创建消费者线程 createCT(); //不按回车键的话程序会一直运行下去 while(g_continue) //按回车键终止程序 if(getchar()) g_continue = 0; return g_continue; } 5、设计小结 (本设计的特色、经验教训和体会等) 6、参考文献 (参考的书籍等,列出书名、作者、出版社及出版时间等,例如: [1]计算机操作系统(第3版),汤小丹,西安电子科技大学出版社,2007年7月 [2]C语言程序设计,孟庆昌,人民邮电出版社,2006年4月 报告各部分内容根据设计的具体情况自行扩展。