通信人家园

 找回密码
 注册

只需一步,快速开始

短信验证,便捷登录

搜索
查看: 3028|回复: 2
打印

C++高手请进? [复制链接]

军衔等级:

  副版主

注册:2006-5-25

爱心徽章,06年为希望小学奉献爱心纪念徽章 爱心徽章,07年为希望小学奉献爱心纪念徽章 爱心徽章,09年为家园助学活动奉献爱心纪念徽章

跳转到指定楼层
1#
发表于 2007-4-10 13:45:00 |只看该作者 |倒序浏览
<p>{<br/>void RunToBlk{PCBpp Run,PCBpp ABlkEd}<br/>[//定义运行态转为阻塞态。<br/>(*Run)-&gt;satate=blocked;<br/>*bLkEd=*Run;<br/>BlkEd++<br/>}</p><p>void RdytoRun(PCBpp &amp;Rdy,PCBpp Run,Policy algthm)<br/>[//定义运行态转为阻塞态。<br/>if(algthm==hpf||algthm==spf)<br/>{<br/>if(*(Tdy+1))<br/>{<br/>(*(Rdy+1))-&gt;state=running;<br/>*Run=*(Rdy+1)<br/>Rdy++;<br/>}<br/>}<br/>else<br/>{<br/>if(*Rdy)<br/>(*Rdy)-&gt;state=running;<br/>*Run=*Rdy;<br/>Rdy++;<br/>}<br/>}<br/>}</p><p>void RunToRdy(PCBpp Run,PCBpp Rdy,PCBpp &amp;RdyEd,Policy algthm)<br/>{//定义运行态转为就绪态。<br/>(*Run)-&gt;state=ready;<br/>*RdyEd=*Run;<br/>RdyEd++;<br/>if(algthm==hpf||algthm==spf)<br/>InsertSort(Rdy,RdyEd,algthm);<br/>}<br/>实验科目:计算机操作系统<br/>实验名称:进程调度模拟编程(实验四)<br/>一、实验目的<br/>通过对进程调度算法的模拟加深对进程概念和进程调度过程的理解。<br/>二、实验内容及仪器<br/>仪器:计算机,C++<br/>内容:用C语言、Pascal语言或其他开发工具实现对N(N=5)个进程的调度模拟,要求至少采用两种不同的调度算法(如简单轮转发Round Robin和优先权高者优先算法Highest Priority First),分别进行模拟调度。<br/>&nbsp;&nbsp;&nbsp; 每个用来标示进程的进程控制块PCB用结构(纪录)来描述根据需要,它包括以下字段:<br/>&nbsp;&nbsp;&nbsp; 进程表识数ID。<br/>&nbsp;&nbsp;&nbsp; 进程优先数Priority,并规定优先数越大的进程,其优先权越高。采用简单轮转法时该字段无用。<br/>&nbsp;&nbsp;&nbsp; 进程已经占用的CPU时间CPUTIME(以时间片为单位,下同)。<br/>&nbsp;&nbsp;&nbsp; 进程还需占用的CPU时间ALLTIME。当进程运行完毕时,ALLTIME变为0。<br/>&nbsp;&nbsp;&nbsp; 进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,进程将进入阻塞状态。<br/>&nbsp;&nbsp;&nbsp; 进程被阻塞的时间BLOCKTIME,表示已经阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。<br/>&nbsp;&nbsp;&nbsp; 进程状态STATE。<br/>&nbsp;&nbsp;&nbsp; 队列指针NEXT,用来将PCB排列成队列。<br/>&nbsp;&nbsp;&nbsp; 优先数改变的原则(采用简单轮转法时该字段无用);<br/>&nbsp;&nbsp;&nbsp; 进程在就绪队列中等待一个时间片,优先数增加1;<br/>&nbsp;&nbsp;&nbsp; 进程每运行一个时间片,优先数减3。<br/>假设在进行调度前,系统中有5个进程,它们的初始状态可以编程输入(更具有灵活性),也可以初始化为如下内容:<br/>ID PRIORITY CPUTIME ALLTIME STATEBLOCK STATE<br/>0 9 0 3 2 3 READY<br/>1 38 0 3 -1 0 READY<br/>2 30 0 6 -1 0 READY<br/>3 29 0 3 -1 0 READY<br/>4 0 0 4 -1 0 READY<br/>&nbsp;&nbsp;&nbsp; 为了清楚地观测诸进程的调度过程,程序应该将每个时间片内各进程的情况显示出来并暂停,参考格式如下:<br/>运行/Running:I<br/>就绪队列/Ready Queue:Idi,Idj,…<br/>阻塞队列/Block Queue:Idk,Idl,…<br/>=========================================================<br/>进程号 优先数 已运行时间 需要时间 开始阻塞时间 阻塞时间 状态<br/>0 P0 C0 A0 T0 B0 S0<br/>1 P1 C1 A1 T1 B1 S1<br/>2 P2 C2 A2 T2 B2 S1<br/>3 P3 C3 A3 T3 B3 S3<br/>4 P4 C4 A4 T4 B4 S4<br/>&nbsp;&nbsp; 三、实验结果和纪录<br/>//C++代码:<br/>#include "stdafx.h"<br/>#include<br/>using std::cout;<br/>using std::cin;<br/>using std::cerr;</p><p>enum Status{running,ready,blocked};<br/>enum Policy{fifo;spf,hpf,rr};</p><p>typedef class PCB<br/>{//定义PCB类。<br/>public:<br/>int id,priority,cputime,alltime startblock,blocktime;<br/>Status state;<br/>class PCB *next;<br/>CB()<br/>{<br/>priority=0;<br/>}<br/>}PCB,*PCBptr,**PCBpp;</p><p>char x;<br/>CBpp,pp;//两个全局变量</p><p>void Print(PCBptr head)<br/>{//打印head为头指针的PCB链表信息。<br/>CBptr p;<br/>cout&lt;&lt;*\n运行/Running:";<br/>for(p=head;p-&gt;next;p=p-&gt;next)<br/>{<br/>if(p-&gt;next-&gt;state==running)<br/>{<br/>cout&lt;&lt;"ID"&lt;next-&gt;id;<br/>break;<br/>}<br/>}<br/>cout&lt;&lt;"\n就绪队列/Ready Queue:";<br/>for(p=head;p-&gt;next;p=p-&gt;next)<br/>if(p-&gt;next-&gt;state==blocked)<br/>cout&lt;&lt;"ID"&lt;next-&gt;id&lt;&lt;'';</p><p>cout&lt;&lt;"\n--------------------------------------------\n"<br/>&lt;&lt;" 进程号 优先数 已运行时间 还需要时间 开始阻塞时间 阻塞时间 状态\n";<br/>for(p=head;p-&gt;next;p=p-&gt;next)<br/>[<br/>cout&lt;&lt;"&nbsp; "&lt;next-&gt;id&lt;&lt;"&nbsp;&nbsp; "&lt;next-&gt;cputime&lt;&lt;"&nbsp;&nbsp; "&lt;next-&gt;alltime"<br/>&nbsp;&nbsp;&nbsp;&nbsp; "&lt;next-&gt;startblock&lt;&lt;"&nbsp;&nbsp;&nbsp; "&lt;next-&gt;blocktime&lt;&lt;"&nbsp; ";<br/>switch(p-&gt;next-&gt;state)<br/>{<br/>case ready:cout&lt;&lt;"就绪";break;<br/>case running:cout&lt;&lt;"运行";break;<br/>case blocked:cout&lt;&lt;"阻塞";break;<br/>default:exit(0);<br/>}<br/>cout&lt;&lt;'\n';<br/>}<br/>cout&lt;&lt;"-----------------------------------------------\n"<br/>&lt;&lt;"按任意键以继续...";<br/>cin&gt;&gt;x;<br/>}<br/>void Delete(PCBptr head,PCBptr p)<br/>{//删除以head为头指针的PCB链表中p所指向的结点。<br/>CBptr q=head;<br/>while(q-&gt;next!=p) q=q-&gt;next;<br/>delete p;<br/>}</p><p>void InsertSort(PCBpp Rdy,PCBpp RdyEd,Policy algthm)<br/>[//直接插入排序。<br/>if(*(Rdy+1))//队列不为空<br/>if(RdyEd-1!=Rdy+1)<br/>{//Ready+1队列中不只一个。<br/>switch(algthm)<br/>{<br/>case hpf;<br/>*Rdy=*(RdyEd-1);<br/>*(RdyEd-1)=*(RdyEd-2);<br/>for(tt=RdyEd-3;(*Rdy)-&gt;priority&gt;(*tt)-&gt;priority;tt--)<br/>*(tt+1)=*tt;<br/>}<br/>break;<br/>case spf;<br/>if((*(RdyEd-1))-&gt;alltime&lt;(*(RdyEd-2))-&gt;alltime)<br/>{<br/>CBpp tt;<br/>*Rdy=*(RdyEd-1);<br/>*(RdyEd-1)=*(RdyEd-2);<br/>for(tt=RdyEd-3;(*Rdy)-&gt;alltime&lt;(*tt)-&gt;alltime;tt--)<br/>*(tt+1)=*tt;<br/>*(tt+1)=*Rdy;<br/>}<br/>}<br/>}<br/>}</p><p>void RunToBlk(PCBpp Run,PCBpp &amp;BlkEd)<br/>{//定义运行态转为阻塞态。<br/>(*Run)-&gt;state=blocked;<br/>*BlkEd=*Run;<br/>BlkEd++;<br/>}</p><p>void RdyToRun(PCBpp &amp;Rdy,PCBpp Run,Policy algthm)<br/>{//定义就绪态转为运行态。<br/>if(algthm==hpf||algthm==spf)<br/>{<br/>if(*(Rdy+1))<br/>{<br/>(*(Rdy+1))-&gt;state=running;<br/>*Run=*(Rdy+1);<br/>Rdy++;<br/>}<br/>}<br/>else<br/>{<br/>if(*Rdy)<br/>{<br/>(*Rdy)-&gt;state=running;<br/>*Run=*Rdy;<br/>Rdy++;<br/>}<br/>}<br/>}</p><p>void RunToRdy(PCBpp,Run,PCBpp Rdy,PCBpp &amp;RdyEd,Policy algthm)<br/>{//定义运行态转化为就绪态。<br/>(*Run)-&gt;state=ready;<br/>*RdyEd=*Run;<br/>RdyEd++;<br/>if(algthm==hpf||algthm==spf)<br/>InsertSort(Rdy,RdyEd,algthm);<br/>}<br/>//以下是主程序<br/>int main()<br/>{<br/>cout&lt;&lt;"***************实验开始****************\n\n需要做几个进程并发执行的实验?;<br/>int n;<br/>if(!(cin&gt;&gt;n))&nbsp; {cerr&lt;&lt;"错误:输入不准确!";exit(0);}</p><p>PCBptr Listhead,Listp,Listq;//建立n个进程<br/>Listhead=new PCB;//<br/>Listp=Listhead;//<br/>for(int i=0;i&lt;=n-1;i++)//<br/>{<br/>Listq=new PCB;//<br/>Listp-&gt;next=Lisq;//<br/>Listp=Listq;//<br/>}<br/>Listp-&gt;next=0;//PCB的队列。</p><p>Policy algorithm;<br/>int num1,num2;<br/>L1:cout&lt;&lt;"\n请选择算法 (0表示FIFO,1表示SPF,2表示HPF,3表示RR):";<br/>if(!(cin&gt;&gt;num1)) {cerr"错误:出入不准确!";exit(0);}<br/>algorithm=Policy(num1);<br/>if(algorithm!=fifo&amp;&amp;algorithm!=spf&amp;&amp;algorithm!=hpf&amp;&amp;algorithm!=rr)<br/>{cout&lt;&lt;"无效的算法不真确!请重新输入:\n";goto L1;}<br/>cout&lt;&lt;"\n现在有"&lt;个进程,首先我们初始化他们的PCB:\n\n";<br/>Listp=Listhead-&gt;next;<br/>for(int i=0;i&lt;=n-1;i++)<br/>{<br/>cout&lt;&lt;"请输入"&lt;号进程的PCB:\n"<br/>Listp-&gt;id=1;<br/>if(algorithm==hpf)<br/>{<br/>cout&lt;&lt;"&nbsp;&nbsp; 优先数 (整数,值越大表明优先权越高):";<br/>if(!(cin&gt;&gt;Listp-&gt;priority))&nbsp; {cerr&lt;&lt;" 错误:输入不正确!";exit(0);}<br/>}<br/>cout&lt;&lt;"&nbsp; 已占用CPU时间(整数,以时间片为单位):";<br/>if(!(cin&gt;&gt;Listp-&gt;cputime)) {cerr&lt;&lt;"错误:输入不正确!";exit(0);}<br/>cout&lt;&lt;"&nbsp;&nbsp; 还需占用CPU时间(整数,以时间片为单位&nbsp; ):";<br/>if(!(cin&gt;&gt;Listp-&gt;cputime))&nbsp; {cerr&lt;&lt;"错误:输入不正确!";exit(0)}<br/>cout&lt;&lt;"&nbsp;&nbsp; 开始阻塞时间(整数,以时间片为单位):";<br/>if(!(cin&gt;&gt;Listp-&gt;startblock))&nbsp; {cerr&lt;&lt;"错误:输入不正确!";exit(0);}<br/>cout&lt;&lt;"&nbsp; 阻塞时间(整数,以时间片为单位):";<br/>if(!(cin&gt;&gt;Listp-&gt;blocktime)) {cerr&lt;&lt;"错误:输入不正确!";exit(0);}<br/>L2: cout&lt;&lt;" 进程状态 (0表示运行,1表示就绪,2表示阻塞):";<br/>if(!(cin&gt;&gt;num2))&nbsp; {cerr&lt;&lt;"错误:输入不正确!";exit(0);}<br/>if(num2!=0&amp;&amp;num2!=2) {cout&lt;&lt;"状态不正确!请重新输入:\n";goto L2;}<br/>Listp-&gt;state=Status(num2);<br/>Listp=Listp-&gt;next;<br/>}</p><p>PCBpp Run=new PCBptr(); //&nbsp; 生成<br/>PCBPP Ready=new PCBptr[100];//<br/>for(int i=0;i&lt;=99;i++) *(Ready+i)=0&nbsp; // 运行<br/>PCBpp ReadyEnd=Ready;//&nbsp;&nbsp;&nbsp; 就绪<br/>PCBp Block=new PCBptr[100];&nbsp; //&nbsp;&nbsp; 阻塞<br/>for(int i=0;i&lt;=99;i++)&nbsp; *(Block+i)=0;&nbsp;&nbsp; //<br/>PCBpp BlockEnd=Block;//&nbsp;&nbsp;&nbsp;&nbsp; 队列</p><p>if(algorithm==hpf||algorithm==spf) ReadyEnd++;&nbsp; //如果是HPF算法 ,用直接插入排序*Ready是哨兵,Ready+1成为队头。<br/>for(Listp=Listhead;Listp-&gt;next;Listp=Listp-&gt;next)<br/>{//把初始化的进程放进各自队列<br/>switch(Listp-&gt;next-&gt;state)<br/>}<br/>case running:*Run=Listp-&gt;next;break;<br/>case ready;<br/>{<br/>*ReadyEnd=Listp-&gt;next;ReadyEnd++;<br/>if(algorithm==hpf||algorithm==spf)<br/>InsertSort(Ready,ReadyEnd,algorithm);<br/>break;<br/>}<br/>case blocked:*BlockEnd=Listp-&gt;next;BlockEnd++;break;<br/>}<br/>}</p><p>cout&lt;&lt;"\n现在这"&lt;个进程开始并发执行...... (按任意键继续...)\n\n";<br/>cin&gt;&gt;x;</p><p>for(int time=1;Listhead-&gt;next;time++)<br/>{//开始并发执行。<br/>cout&lt;&lt;"\n第"&lt;个时间片结束后:";</p><p>if(*Run)<br/>{//Run队列的变化。<br/>if(algorithm==hpf)<br/>(*Run)-&gt;priority-=3;<br/>(*Run)-&gt;cputime++;<br/>if((*Run)-&gt;alltime&gt;0)<br/>(*Run)-&gt;alltime--;<br/>if((*Run)-&gt;starblock&gt;0)<br/>(*Run)-&gt;startblock--;<br/>}<br/>if(algorithm==hpf)<br/>{//Ready+1队列的变化。<br/>if(*(Ready+1))<br/>for(pp=Ready+1;pp!=ReadyEd;pp++)<br/>(*pp)-&gt;blocktime--;<br/>}</p><p>Print(Listhead);</p><p>if(*Block)<br/>{<br/>pp=Block;<br/>while(pp!=BlockEnd)<br/>{//把已经阻塞好了的进程移到就绪队列。<br/>if((*pp)-&gt;blocktime==0)<br/>{<br/>(*pp)-&gt;state=ready;<br/>*ReadyEd=*pp;ReadyEnd++;<br/>if(algorithm==hpf||algorithm==spf)<br/>InserSort(Ready,ReadyEnd,algorithm);<br/>for(PCBpp ss=pp;ss!=BlockEnd;ss++)<br/>*ss=*(ss+1);<br/>BlokEnd--;<br/>}<br/>else pp++;<br/>}<br/>}</p><p>if(*Run)<br/>{<br/>if((*Run)-&gt;alltime==0)<br/>{//如果运行完了,把该进程撤消,并拿就绪队头的进程来运行。<br/>Delete(Listhead,*Run);<br/>RdyToRun(Ready,Run,algorithm);<br/>}<br/>else <br/>{//没运行完<br/>if((*Run)-&gt;startblock==0)<br/>{//如果该阻塞了,则放入阻塞队列,并拿就绪对头的进程来运行。<br/>RunToBlk(Run,BlockEnd);<br/>RdyToRun(Ready,Run,algorithm);<br/>}<br/>else<br/>{//如果没阻塞<br/>if(algorthm==hpf)<br/>{//在HPF算法下,比较现在运行的进程的优先权和*(Ready+1)的优先权的大小。<br/>if(*(Ready+1))<br/>if((*Run)-&gt;priority&lt;(*(Ready+1))-&gt;priority)<br/>{//下台了。<br/>(*Run)-&gt;state=ready;<br/>*ReadyEnd=*Run;ReadyEnd++;<br/>InsertSort(Ready,ReadyEnd,algorithm);<br/>if(*(Ready+1))<br/>Ready++;<br/>}<br/>}<br/>}<br/>if(algorithm==rr)<br/>{//在rr算法下就加入就绪队尾。<br/>(*Run)-&gt;state=ready;<br/>*ReadyEnd=*Run;<br/>ReadyEnd++;<br/>if(*Ready)<br/>{<br/>(*Ready)-&gt;state=running;<br/>*Run=*Ready;<br/>Ready++;<br/>}<br/>}<br/>}<br/>}<br/>}<br/>else<br/>RdyToRun(Ready,Run,algorithm);<br/>}</p><p>return 0;<br/>}<br/></p><p></p><p></p><p></p><p></p><p>#include &lt;stdlib.h&gt;</p><p>#include &lt;windows.h&gt;</p><p>&nbsp;</p><p>#include "Reader-Writer.h"</p><p>#include "Semaphore.h"</p><p>&nbsp;</p><p>// 这是 Windows 下多线程工作的 P 操作</p><p>#define P(S) WaitForSingleObject(S, INFINITE)</p><p>&nbsp;</p><p>// 这是 Windows 下多线程工作的 V 操作</p><p>#define V(S) ReleaseSemaphore(S, 1, NULL)</p><p>&nbsp;</p><p>const int RN = 5; // 所有读者总数</p><p>const int WN = 3; // 所有写者总数</p><p>&nbsp;</p><p>HANDLE Sdoc; // 文档信号量——互斥量</p><p>HANDLE Sr;&nbsp;&nbsp; // 读者信号量——广义信号量</p><p>&nbsp;</p><p>HANDLE Scnt; // 保护 g_cntReader 的互斥量</p><p>int g_cntReader = 0; // 读者个数计数器</p><p>&nbsp;</p><p>// ##############+. Descripted By Tang Houjian [2003-9-26 20:10:49] .+##########</p><p>// |&nbsp; funcname&nbsp; :&nbsp; JustWait ( ) </p><p>// +&nbsp; note&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :&nbsp; 显示一些信息,让后等待</p><p>// |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p><p>// +-----------------------------------------------------------------+</p><p>// |&nbsp; ret val&nbsp;&nbsp; :&nbsp; void </p><p>// |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p><p>// +&nbsp; Parameter :&nbsp; </p><p>// |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&nbsp;&nbsp;&nbsp; int ] - nReader 读者(写者)编号,读者&gt;0,写者&lt;0</p><p>// |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&nbsp;&nbsp;&nbsp; int ] - min&nbsp;&nbsp;&nbsp;&nbsp; 操作等待的最短时间</p><p>// |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&nbsp;&nbsp;&nbsp; int ] - max&nbsp;&nbsp;&nbsp;&nbsp; 操作等待得最长时间,实际等待的时间介于两者之间</p><p>// |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ LPCSTR ] - info&nbsp;&nbsp;&nbsp; 要显示的信息</p><p>void JustWait(int nReader, int min, int max, LPCSTR info)</p><p>// +-----------------------------------------------------------------+</p><p>{</p><p>&nbsp;&nbsp;&nbsp; // 等待时间的基本量,以毫秒表示</p><p>&nbsp;&nbsp;&nbsp; const int BASETIME = 1000;</p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp; // 实际等待得时间</p><p>&nbsp;&nbsp;&nbsp; int wait_time = 0;</p><p>&nbsp;&nbsp;&nbsp; if (max==min)&nbsp; // 判断是为了避免 %0错误,注意取随机值</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wait_time = min*BASETIME;</p><p>&nbsp;&nbsp;&nbsp; else</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wait_time = rand()%(max*BASETIME-min*BASETIME) + min*BASETIME;</p><p></p><p><br/>&nbsp;// 最终显示的信息缓冲</p><p>&nbsp;&nbsp;&nbsp; char s_out[128];</p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp; // 读者大于0,写者小于0</p><p>&nbsp;&nbsp;&nbsp; if (nReader &gt; 0)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sprintf(s_out, "Reader [%d]: %s\n", nReader, info);</p><p>&nbsp;&nbsp;&nbsp; else</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sprintf(s_out, "\tWriter [%d]: %s\n", -nReader, info);</p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp; // 打印</p><p>&nbsp;&nbsp;&nbsp; printf(s_out);</p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp; // 然后等待</p><p>&nbsp;&nbsp;&nbsp; Sleep(wait_time);</p><p>}</p><p>&nbsp;</p><p>// 这是主函数</p><p>void TryReaderAndWriter()</p><p>{</p><p>&nbsp;&nbsp;&nbsp; // 创建信号量&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这是初值--+&nbsp; +----这是最大信号量值</p><p>&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp; |</p><p>&nbsp;&nbsp;&nbsp; Sdoc = CreateSemaphore(NULL, 1, 1, "Document");</p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp; // 一次最多允许 3 个读者读</p><p>&nbsp;&nbsp;&nbsp; Sr = CreateSemaphore(NULL, 3, 3, "ReaderNumber");</p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp; // 他也是一个互斥信号量,初值为 1</p><p>&nbsp;&nbsp;&nbsp; Scnt = CreateSemaphore(NULL, 1, 1, "ReaderCounterProtect");</p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp; // 线程句柄</p><p>&nbsp;&nbsp;&nbsp; HANDLE threads[RN+WN];</p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp; // 创建读者线程,共有 RN 个读者</p><p>&nbsp;&nbsp;&nbsp; for (int i=0; i&lt;RN; i++)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; threads = CreateThread(0, 0, Reader, 0, 0, 0);</p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp; // 创建写者线程,共有 WN 个写者</p><p>&nbsp;&nbsp;&nbsp; for (int j=0; j&lt;WN; j++)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; threads[j+RN] = CreateThread(0, 0, Writer, 0, 0, 0);</p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp; WaitForMultipleObjects(RN+WN, threads, TRUE, INFINITE);</p><p>}</p><p>&nbsp;</p><p>// 读者线程</p><p>DWORD WINAPI Reader(LPVOID lpPara)</p><p>{</p><p>&nbsp;&nbsp;&nbsp; // 注意是静态变量,可以使每来一个读者增加一</p><p>&nbsp;&nbsp;&nbsp; static int reader_num = 1;</p><p>&nbsp;&nbsp;&nbsp; int i = reader_num ++;</p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp; while (1)</p><p>&nbsp;&nbsp;&nbsp; {</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JustWait(i, 1, 2, "I want to Read");</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 读者未满</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; P(Sr);</p><p></p><p><br/>&nbsp;// 锁定读者计数器</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; P(Scnt);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("//: %d Readers in, [%d] in\n”, g_cntReader, i);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g_cntReader ++;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 如果是第一个读者</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (g_cntReader == 1) </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JustWait(i, 1, 2, "I am NUMBER-ONE!");</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 锁定文档</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; P(Sdoc);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("#----------[%d] &lt;== Doc busy\n", i);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JustWait(i, 1, 2, "I have get the document");</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 解锁读者计数器</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; V(Scnt);</p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 读ing…………</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JustWait(i, 2, 5, "I am reading...");</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JustWait(i, 1, 2, "I want to get out");</p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 锁定读者计数器</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; P(Scnt);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g_cntReader --;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 如果是最后一个</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (g_cntReader == 0) </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JustWait(i, 1, 2, "I am the LAST-ONE!");</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("----------#[%d] ==&gt; Doc free\n", i);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 解锁文档</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; V(Sdoc);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("//: %d Readers Left, [%d] is out\n”, g_cntReader, i);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 解锁读者计数器</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; V(Scnt);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 离开</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; V(Sr);</p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JustWait(i, 5, 3, "Rest^^^^^^^^^^^^");</p><p>&nbsp;&nbsp;&nbsp; }</p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp; return 0;</p><p>}</p><p>DWORD WINAPI Writer(LPVOID lpPara)</p><p>{</p><p>&nbsp;&nbsp;&nbsp; // 注意是静态变量,可以使每来一个写者减去一,注意初值是负值</p><p>&nbsp;&nbsp;&nbsp; static int g_cnt = -1; </p><p>&nbsp;&nbsp;&nbsp; int j = g_cnt --;</p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp; while (1)</p><p>&nbsp;&nbsp;&nbsp; {</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JustWait(j, 2, 4, "I want write...");</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 锁定文档</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; P(Sdoc);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\t#==========[%d] &lt;== Doc busy\n", -j);</p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 写ing……</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JustWait(j, 4, 3, "WRITING......");</p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JustWait(j, 1, 2, "write over! Out");</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\t==========#[%d] ==&gt; Doc free\n", -j);</p><p></p><p></p><p>&nbsp;// 解锁文档</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; V(Sdoc);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JustWait(j, 8, 4, "Rest~~~~~~~~~~~~~");</p><p>&nbsp;&nbsp;&nbsp; }</p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp; return 0;</p><p>}</p><p>"Reader-Writer.h"和"Semaphore.h"头文件怎么编 非常感谢!!<br/></p><p></p>

举报本楼

本帖有 2 个回帖,您需要登录后才能浏览 登录 | 注册
您需要登录后才可以回帖 登录 | 注册 |

版规|手机版|C114 ( 沪ICP备12002291号-1 )|联系我们 |网站地图  

GMT+8, 2025-7-16 22:26 , Processed in 0.605807 second(s), 18 queries , Gzip On.

Copyright © 1999-2025 C114 All Rights Reserved

Discuz Licensed

回顶部