编程实现经典IPC问题.docxVIP

  • 16
  • 0
  • 约5.62千字
  • 约 8页
  • 2018-07-10 发布于上海
  • 举报
学  号2016143222姓名王娟实验日期2018.实验名称编程实现经典IPC问题 实验目的:在本实验中,通过对临界区,互斥体和信号量在经典同步问题中的使用,来加深对线程同步的理解。实验内容:编写程序实现生产者——消费者问题,哲学家进餐问题,读者—写者问题。实验原理:(含相关算法流程图,可写多页)生产者-消费者问题是一个经典的进程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制。在同一个进程地址空间内执行的两个线程生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。问题的实质是P、V操作,实验设一个共享缓冲区,当一个线程使用缓冲区的时候,另一个让其等待直到前一个线程释放缓冲区为止。读者作家(RW)或共享独占锁(也称为多个读取器/单写入器锁定或多读卡器锁)的一个同步原语,解决了一个读者-writers问题。一个RW锁允许并发的只读操作的访问,而写操作需要独占访问。这意味着多个线程可以并行读出的数据,但独占锁是需要编写或修改数据。当一个作家写数据,直到作家写完所有其他作家或读者将被阻止。一个常见的用途可能是用于控制访问存储器中的数据结构不能被更新原子和是无效的(不应该由另一个线程被读取),直到完成更新。读者作家锁通常建在上面互斥和条件变量,或在顶部信号量。实验过程与结果: 1.生产者——消费者问题# include windows.h# include iostream.h # include stdio.h const num=10;volatile int in=0,out=0;int buf[5]={0,0,0,0,0};HANDLE empty,full;CRITICAL_SECTION cs;static DWORD WINAPI Threadp(LPVOID lp){ LONG np=reinterpret_castLONG(lp); Sleep(np*10); LONG item=np+100; WaitForSingleObject(empty,INFINITE); EnterCriticalSection(cs); buf[in]=item;in=(in+1)%5; coutnp producer produce an itemitemendlflush; LONG nPrevCt(0); if(ReleaseSemaphore(full,1,nPrevCt)) coutnpproducer ended,full is:nPrevCt+1endlflush; LeaveCriticalSection(cs); return(0);}static DWORD WINAPI Threadc(LPVOID lp){ LONG np=reinterpret_castLONG(lp); Sleep(np*1000); WaitForSingleObject(full,INFINITE); EnterCriticalSection(cs); LONG item=buf[out];out=(out+1)%5; coutnpconsumer consummed an item:itemendlflush; LONG nPrevCt(0); if(ReleaseSemaphore(empty,1,nPrevCt)) coutnpconsumerended,empty is:nPrevCt+1endlflush; LeaveCriticalSection(cs); return(0);}void main(){ HANDLE hp[num]; HANDLE hc[num]; InitializeCriticalSection(cs); empty=CreateSemaphore(NULL,5,5,NULL); full=CreateSemaphore(NULL,0,5,NULL); for(int n=0;nnum;n++) { hp[n]=CreateThread(NULL,0,Threadp,reinterpret_castLPVOID(n),0,NULL); printf(%d producer created\n,n); hc[n]=CreateThread(NULL,0,Threadc,rei

文档评论(0)

1亿VIP精品文档

相关文档