生产者消费者实验_第1页
生产者消费者实验_第2页
生产者消费者实验_第3页
生产者消费者实验_第4页
生产者消费者实验_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

生产者消费者实验实验内容:以生产者消费者模型为依据,提供一个多线程生产者-消费者实例,用VC或java实现,并具备以下功能:可改变缓冲区数目;可增加或减少线程数目;改变延迟时间;可增加或减少生产者、消费者进程数目;可改变消费者进程请求序列;你需要提交以下材料:程序流程图;程序源代码;实验报告。分析缓冲区数目、线程数目、生产者消费者数目以及消费者请求序列对于结果产生的影响。测试用例:线程序号线程标识延迟时间消费顺序缓冲区数目1P55个2P43P24C65,65P76P17C31,3,2输入以上内容,输出结果为:生产者 6 发出请求生产信号生产者 6 开始在缓冲区 0 生产生产者 6 完成生产缓冲区[0]:6生产者 3 发出请求生产信号生产者 3 开始在缓冲区 1 生产生产者 3 完成生产缓冲区[1]:3消费者7请求消费 1 产品生产者 2 发出请求生产信号生产者 2 开始在缓冲区 2 生产生产者 2 完成生产缓冲区[2]:2生产者 1 发出请求生产信号生产者 1 开始在缓冲区 3 生产生产者 1 完成生产缓冲区[3]:1消费者 7 开始消费 3 产品消费者 7 成功消费 1缓冲区[3]: -1消费者7请求消费 3 产品消费者 7 开始消费 3 产品消费者 7 成功消费 3缓冲区[1]: -1消费者7请求消费 2 产品消费者 7 开始消费 2 产品消费者 7 成功消费 2缓冲区[2]:-1消费者 4 请求消费 5 产品生产者 5 发出请求生产信号生产者 5 开始在缓冲区 1 生产生产者 5 完成生产缓冲区[1]:5消费者 4 开始消费 5 产品消费者 4 成功消费 5缓冲区[1]:-1消费者 4 请求消费 6 产品消费者 4 开始消费 6 产品消费者 4 成功消费 6缓冲区[0]:-1附录:程序可能用到的相关函数InitializeCriticalSection()函数函数原型:VOIDInitializeCriticalSection(LPCRITICAL_SECTIONlpCriticalSection)函数功能:初始化一个临界资源对象;参数:lpCriticalSection是临界资源对象指针;CreateSemapore()函数函数原型:HANDLECreatSemaphore(LPSECURITY_ATTRIBUTESlpAttributesLONGlInitialCountLONGlMaximumCountLPCTSTRlpName)函数功能:该函数是创建一个有名或者无名信号对象。参数:LpAttributes:安全属性。如果是NULL就表示要使用默认属性。lInitialCount:Semaphore的初值。必须大于或等于0,并且小于或等于MaxmumCount。lMaximumCount:Semaphore的最大值。这也就是在同一时间内能够锁住Semaphore之线程的最多个数。lpName:Semaphore的名称一个字符串。任何线程或进程都可以根据这一名称引用到这个Semaphore。这个值可以是NULL,意思是产生—个没有名字的Semaphore。返回值:如果成功就传回一个handle,否则传回NULL。不论哪一种情况,GetLastError都会传回一个合理的结果。如果指定的Semaphore名称已经存在,则该函数还是成功的,GetLastError会传回ERROR_ALREADY_EXISTS。CreateMutex()函数函数功能:该函数创建有名或者无名的互斥对象。函数原型:HANDLECreateMutexLPSECURITY_ATTRIBUTESlpMutexAttributesBOOLbInitialOwnerLPCTSTRlpName参数:lpMutexAttributes:指向SECURITY_ATTRIBUTES结构的指针,该结构决定子进程是否能继承返回句柄。如果lpMutexAttributes为NULL,那么句柄不能被继承。在WindowsNT中该结构的LpSecuriyDescriptor成员指定新互斥对象的安全描述符。如果lpMutexAttributes为NULL,那么互斥对象获得默认的安全描述符。bInitialOwner:指定互斥对象的初始所属身份。如果该值为TRUE,并且调用者创建互斥对象,那么调用线程获得互斥对象所属身份。否则,调用线程不能获得互斥对象所属身份。判断调用者是否创建互斥对象清参阅返回值部分。lpName:指向以NULL结尾的字符串,该字符串指定了互斥对象名。该名字的长度小于MAX_PATH且可以包含除反斜线\路径分隔符以外的任何字符。名字是区分大小写的。如果lpName与已存在的有名互斥对象名相匹配,那么该函数要求用MUTEX_ALL_ACCESS权限访问已存在的对象。在这种情况下,由于参数bInitialOwner已被创建进程所设置,该参数被忽略。如果参数lpMutexAttributes不为NULL,它决定句柄是否解除继承,但是其安全描述符成员被忽略。如果lpName为NULL,那么创建的互斥对象无名。如果lpName与已存在的事件、信号量、可等待定时器、作业或者义件映射对象的名字相匹配,那么函数调用失败,并且GetLastError函数返回ERROR_ALREADY_HANDLE其原因是这些对象共享相同的名字空间。返回值:如果函数调用成功,返回值是互斥对象句柄;如果函数调用之前,有名互斥对象已存在,那么函数给已存在的对象返回一个句柄,并且函数GetLastError返回ERROR_ALREADY_EXISTS。否则,调用者创建互斥对象。如果函数调用失败,则返回值为NULL。若想获得更多错误信息,请调用GetLastError函数。备注:由函数CreateMutex返回的句柄有MUTEX_ALL_ACCESS权限可以去访问新的互斥对象,并且可用在请求互斥对象句柄的任何函数中。调用进程中的任何线程可以在调用等待函数时指定互斥对象句柄。当指定对象的状态为信号态时。返回单对象等待函数。当任何一个或者所有的互斥对象都为信号态时,返回多对象等待函数指令。等待函数返回后,等待的线程被释放,继续向下执行。当一个互斥对象不被任何线程拥有时,处于信号态。创建该对象的线程可以使用bInitialOwner标志来请求立即获得对该互斥对象的所有权。否则,线程必须使用等待函数来请求所有权。当互斥对象处于信号态,等待的线程获得对该对象的所有权时,此互斥对象的状态被设置为非信号态,等待函数返回。任意时刻,仅有一个线程能拥有该互斥对象.线程可以使用ReleaseMutex函数来释放对这个互斥对象的所有权。总线程已经拥有了—个互斥对象,那么它可以重复调用等待函数而不会发生阻塞,一般情况下,用户不会重复等待同一个互斥对象,这种机制防止了线程因等待它已经拥有的互斥对象而发生死锁。然而,线程必须为每一次等待调用一次ReleaseMutex函数来释放该互斥对象。两个或多个进程可以调用CreateMutex来创建同名的互斥对象,第一个进程实际创建互斥对象.以后的进程打开已存在的互斥对象的句柄。这使得多个进程可以得到同一个互斥对象的句柄,从而减轻了用户的负担,使用户不必判断创建进程是否为第一个启动的进程。使用这种技术时,应该把bInitialOwner标志设为FALSE;否则很难确定开始时哪一个进程拥有该互斥对象。由于多进程能够拥有相同互斥对象的句柄,通过使用这个对象,可使多进程同步。以下为共享对象机制:如果CreateMutex中的lpMutexAttributes参数允许继承,由CreateProcess函数创建的子进程可以继承父近程的互斥对象句柄。一个进程可以在调用DuplicateHandle函数时指定互斥对象句柄来创建一个可以被其他进程使用的双重句柄。一个进程在调用OpenMutex或CreateMutex函数时能指定互斥对象名。使用CloseHandle函数关闭句柄,进程结束时系统自动关闭句柄。当最后一个句柄被关闭时,互斥对象被销毁。CreateThread()函数函数功能:该函数创建一个在调用进程的地址空间中执行的线程。函数原型:HANDLECreateThreadLPSECURITY_ATTRIBUTESlpThreadAttributesDWORDdwStackSizeLPTHREAD_START_ROUTINElpStartAddressLPVOIDlpParameterDWORDdwCreationFlagsLPDWORDlpThreadId参数:lpThreadAttributes:指向一个LPSECURITY_ATTRIBUTES结构。该结构决定了返回的句柄是否可被子进程继承。若lpThreadAttributes为NULL,则句柄不能被继承。若在WindowsNT中该结构的lpSecurityDescriptor成员定义了新进程的安全性描述符。lpThreadAttributes为NULL。则线程获得—个默认的安全性描述符。dwStackSize:定义原始堆栈提交时的大小按字节计。系统将该值舍入为最近的页。若该值为0,或小于默认时提交的大小,默认情况是使用与调用线程同样的大小.更多的信息,请看ThreadStackSize。lpStartAddress:指向一个LPTHREAD_START_ROUTINE类型的应用定义的函数,该线程执行此函数。该指针还表示远程进程中线程的起始地址。该函数必须存在于远程进程中。lpParameter:定义一个传递给该进程的32位值。dwCreationFlags:定义控制进程创建的附加标志。若定义了CREATE_SUSPENDED标志,线程创建时处于挂起状态,并且直到ResumeThread函数调用时才能运行。若该值为0,则该线程在创建后立即执行。lpThreadId:指向—个32位值,它接收该线程的标识符。返回值:若函数调用成功,返回值为新线程的句柄;若函数调用失败,返回值为NULL。备注:新进程的句柄创建时设为THREAD_ALL_ACCESS访问权限。若未提供安全性描述符,则该句柄可被任何要求一个线程对象句柄的函数所使用。若提供了安全性描述符,则以后使用该句柄时,将在授权访问以前执行访问检查。若访问检查拒绝访问,则请求进程不能使用该句柄获得对该线程的访问。线程从lpStartAddress参数定义的函数处开始执行。若该函数返回,系统将默认地认为以调用ExitThread函数的方法终止该线程。使用GetExitcodeThread函数来获得线程的返回值。线程创建时拥有THREAD_PRIORITY_NORMAL优先权。使用GetThreadPriority和SetThreadPriority函数可以获得和设置线程的优先权值。一个线程终止时。该线程对象被设为发信号状态,以满足在该对象上等待的所有进程。一个线程对象始终存在于系统中,直到该线程终止,且它所有的句柄都已通过调用CloseHandle函数关闭。WaitForSingleObject()函数函数功能:当下列情况之一发生时该函数返回:(1)指定对象处于信号态;(2)超时。函数原型:DWORDWaitForSingleObjectHANDLEhHandleDWORDdwMilliseconds参数:hHandle:等待对象句柄。若想了解指定句柄的对象类型列表,参阅下面备注部分。在WindowsNT中,句柄必须有SYNCHRONIZE访问权限。若想获得更多的信息,请查看StandardAccessRights。dwMilliseconds:指定以毫秒为单位的超时间隔。如果超时,即使对象的状态是非信号态的并且没有完成,函数也返回。如果dwMillseconds是0,函数测试对象的状态并立刻返回;如果dwMillseconds是INFINITE,函数从不超时。返回值:如果函数调用成功,返回值表明引起函数返回的事件。可能值如下:WAIT_ABANDONED:指定对象是互斥对象,在线程被终止前,线程没有释放互斥对象。互斥对象的所属关系被授予调用线程,并且该互斥对象被置为非信号态。WAIT_OBJECT_0:指定对象的状态被置为信号态。WAIT_TIMEOUT:超时,并且对象的状态为非信号态。如果函数调用失败,返回值是WAIT_FAILED。若想获得更多错误信息,请调用GetLastError函数。备注:WaitForSingleObjects函数决定等待条件是否被满足。如果等待条件并没有被满足,调用线程进入—个高效的等待状态,当等待满足条件时占用非常少的处理器时间。在运行前。一个等待函数修改同步对象类型的状态。修改仅发生在引起函数返回的对象身上。例如,信号得计数减1。WaitForSingleObjects函数能等待的对象包括:Changenotifica

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论