每天一算法(三)生产着消费者问题
来源:互联网 发布:厦门seo陈仁潘 编辑:程序博客网 时间:2024/05/16 07:04
// multiThread.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include<windows.h>#include<iostream>using namespace std;const unsigned short SIZE_OF_BUFFER=10; //the length of bufferunsigned short buffer[SIZE_OF_BUFFER]={0}; //create space for bufferunsigned short in=0; //the mark of position entering the space unsigned short out=0; //the mark of position leaving the spaceunsigned short Product_ID=0; //the ID of product,from 1 to 10,not for countunsigned short Consume_ID=0; //the ID of consume product_ID in the bufferunsigned int produce_sum=0; //the total produce numberunsigned int consume_sum=0; //the total consume numberHANDLE mutex; //the mutex between threadsHANDLE Full_Semaphore; //the resource semaphore: buffer is fullHANDLE Empty_Semaphore; //the resource semaphore: buffer is emptyconst unsigned short p_count=20; //the number of produce one timeconst unsigned short c_count=6; //the number of consumer one timeconst unsigned short s_count=p_count+c_count; //the sum number of threadsHANDLE threads[s_count]; //the handle of every threadDWORD Producer_ID[p_count]; //the mark of producer threadDWORD Consumer_ID[c_count]; //the mark of consumer threadunsigned short control=1; //control the program run or stopDWORD WINAPI producer(LPVOID); //the producer threadDWORD WINAPI consumer(LPVOID); //the consumer threadvoid produce(); void consume();void Create_P_Threads(); //create producer threadvoid Create_C_Threads(); //create consumer threadvoid Product_Sum(); //print the total of remain product number and print the buffervoid info(); //infovoid Product_Sum(){int i,sum=0;for(i=0;i<SIZE_OF_BUFFER;i++){if(buffer[i]!=0)sum++;}std::cout<<" "<<sum<<" ";for(i=0;i<SIZE_OF_BUFFER;i++){std::cout<<buffer[i]<<" ";}printf("\n");}void produce(){int i;std::cout<<"produce";if(Product_ID>=10)Product_ID=0;Product_ID++;produce_sum++;buffer[in]=Product_ID;printf(" buffer[%d]=%d ",in,Product_ID);in=(in+1)%SIZE_OF_BUFFER;Product_Sum();}void consume(){int i;std::cout<<"consume";consume_sum++;Consume_ID=buffer[out];printf(" buffer[%d]=%d ",out,Consume_ID);buffer[out]=0;out=(out+1)%SIZE_OF_BUFFER;Product_Sum();}DWORD WINAPI producer(LPVOID) //producer thread{while(control){WaitForSingleObject(Full_Semaphore,INFINITE); //resource semaphore P operationWaitForSingleObject(mutex,INFINITE); //the mutex P operationproduce();Sleep(1000);ReleaseMutex(mutex); //resource semaphore P operationReleaseSemaphore(Empty_Semaphore,1,NULL); //the mutex P operation}return 0;}DWORD WINAPI consumer(LPVOID) //consumer thread{while(control){WaitForSingleObject(Empty_Semaphore,INFINITE);WaitForSingleObject(mutex,INFINITE);consume();Sleep(1000);ReleaseMutex(mutex);ReleaseSemaphore(Full_Semaphore,1,NULL);}return 0;}void Create_P_Threads() //create producer thread{for(int i=0;i<p_count;i++){threads[i]=CreateThread(NULL,0,producer,NULL,0,&Producer_ID[i]);if(threads[i]==NULL)control=0;}}void Create_C_Threads(){for(int i=p_count;i<s_count;i++){threads[i]=CreateThread(NULL,0,consumer,NULL,0,&Consumer_ID[i-p_count]);if(threads[i]==NULL)control=0;}}void info(){std::cout<<"\n"<<std::endl;std::cout<<"**********I did refer to the program on the web."<<std::endl; std::cout<<"*******and I simplify some things and make it more powful!"<<std::endl;std::cout<<"**But it is really a word a word knocked out by me based on understanding\n"<<std::endl;std::cout<<"produce/consume remain_total buffer_state(from 0 to 9)"<<std::endl;}int main(){info();mutex=CreateMutex(NULL,FALSE,NULL);Full_Semaphore=CreateSemaphore(NULL,SIZE_OF_BUFFER,SIZE_OF_BUFFER,NULL);Empty_Semaphore=CreateSemaphore(NULL,0,SIZE_OF_BUFFER,NULL);Create_P_Threads();Create_C_Threads();while(control){if(getchar()){std::cout<<std::endl;std::cout<<"the total produce product number is "<<produce_sum<<std::endl;std::cout<<"the total consume product number is "<<consume_sum<<std::endl;control=0;}}return 0;}
0 0
- 每天一算法(三)生产着消费者问题
- POSIX信号量与生产着消费者问题
- 生产消费者问题代码
- 生产消费者问题 CreateMutex
- java 生产消费者问题
- java_Thread生产消费者问题
- 生产-消费者问题
- java实现生产消费者问题
- 一个生产这消费者问题
- 每天一句(三)
- 生产与消费者三种模型
- (转)生产消费者模型
- 每天一算法——约瑟夫问题
- 多线程之信号量--生产消费者问题
- 线程条件变量应用(消费者和生产着模型)
- Java线程之1.4版多生产多消费者示例(三)
- 每天积累一点(一三)--JVM之GC算法
- 每天一道算法题(一) (动态规划算法)背包问题Java实现
- 九度OJ 1437 To Fill or Not to Fill ( 贪心算法)
- JSTL 核心标签库 使用
- MySQL基础知识---------mysql_real_connect()
- vlookup 的#N/A(2)
- IOS7学习之路九(ios7自定义UIAlertView)
- 每天一算法(三)生产着消费者问题
- HttpURLConnection与HttpClient区别及联系
- 插入排序
- 局域网内用IIS架设网站,解决本机可访问,但网内其他用户无法访问问题
- CELERY 消息队列配置
- sicily 1441 pie
- LeetCode 142 Linked List Cycle II
- 逆向笔记【贰】
- make: warning: Clock skew detected. Your build may be incomplete