第1页共8页编号:时间:2021年x月x日书山有路勤为径,学海无涯苦作舟页码:第1页共8页#include#include#include#include#include//定义一些常量;//本程序允许的最大临界区数;#defineMAX_BUFFER_NUM10//秒到微秒的乘法因子;#defineINTE_PER_SEC1000//本程序允许的生产和消费线程的总数;#defineMAX_THREAD_NUM64//定义一个结构,记录在测试文件中指定的每一个线程的参数structThreadInfo{intserial;//线程序列号charentity;//是P还是Cdoubledelay;//线程延迟intthread_request[MAX_THREAD_NUM];//线程请求队列intn_request;//请求个数};第2页共8页第1页共8页编号:时间:2021年x月x日书山有路勤为径,学海无涯苦作舟页码:第2页共8页//全局变量的定义//临界区对象的声明,用于管理缓冲区的互斥访问;CRITICAL_SECTIONPC_Critical[MAX_BUFFER_NUM];intBuffer_Critical[MAX_BUFFER_NUM];//缓冲区声明,用于存放产品;HANDLEh_Thread[MAX_THREAD_NUM];//用于存储每个线程句柄的数组;ThreadInfoThread_Info[MAX_THREAD_NUM];//线程信息数组;HANDLEempty_semaphore;//一个信号量;HANDLEh_mutex;//一个互斥量;DWORDn_Thread=0;//实际的线程的数目;DWORDn_Buffer_or_Critical;//实际的缓冲区或者临界区的数目;HANDLEh_Semaphore[MAX_THREAD_NUM];//生产者允许消费者开始消费的信号量;//生产消费及辅助函数的声明voidProduce(void*p);voidConsume(void*p);boolIfInOtherRequest(int);intFindProducePositon();intFindBufferPosition(int);intmain(void){//声明所需变量;DWORDwait_for_all;ifstreaminFile;//初始化缓冲区;for(inti=0;i>n_Buffer_or_Critical;inFile.get();printf("输入文件是:\n");//回显获得的缓冲区的数目信息;printf("%d\n",(int)n_Buffer_or_Critical);//提取每个线程的信息到相应数据结构中;while(inFile){inFile>>Thread_Info[n_Thread].serial;inFile>>Thread_Info[n_Thread].entity;inFile>>Thread_Info[n_Thread].delay;charc;inFile.get(c);while(c!='\n'&&!inFile.eof()){inFile>>Thread_Info[n_Thread].thread_request[Thread_Info[n_Thread].n_request++];inFile.get(c);}n_Thread++;}//回显获得的线程信息,便于确认正确性;for(j=0;j<(int)n_Thread;j++){intTemp_serial=Thread_Info[j].serial;charTemp_entity=Thread_Info[j].entity;doubleTemp_delay=Thread_Info[j].delay;printf("\nthread%2d%c%f",Temp_serial,Temp_entity,Temp_delay);intTemp_request=Thread_Info[j].n_request;for(intk=0;k