收藏 分销(赏)

实验二-进程(线程)的同步与互斥.doc

上传人:精**** 文档编号:2668976 上传时间:2024-06-04 格式:DOC 页数:8 大小:212.01KB
下载 相关 举报
实验二-进程(线程)的同步与互斥.doc_第1页
第1页 / 共8页
实验二-进程(线程)的同步与互斥.doc_第2页
第2页 / 共8页
实验二-进程(线程)的同步与互斥.doc_第3页
第3页 / 共8页
实验二-进程(线程)的同步与互斥.doc_第4页
第4页 / 共8页
实验二-进程(线程)的同步与互斥.doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

1、实验二 进程(线程)的同步与互斥一、实验目的1 掌握基本的同步与互斥算法,理解生产者消费者模型。2 学习使用Windows中基本的同步对象,掌握相关API的使用方法。3 了解Windows中多线程的并发执行机制,实现进程的同步与互斥。二、实验内容1 实验内容以生产者/消费者模型为依据,在Windows 环境下创建一个控制台进程,在该进程中创建n个线程模拟生产者和消费者,实现进程(线程)的同步与互斥。Buffer(共享内存)生产者消费者2 实验要求l 学习并理解生产者/消费者模型及其同步/互斥规则;l 学习了解Windows同步对象及其特性;l 熟悉实验环境,掌握相关API的使用方法;l 设计程

2、序,实现生产者/消费者进程(线程)的同步与互斥;三、相关API的功能及使用我们利用Windows SDK提供的API编程实现实验题目要求,而VC中包含有Windows SDK的所有工具和定义。要使用这些API,需要包含堆这些函数进行说明的SDK头文件最常见的是Windows.h(特殊的API调用还需要包含其他头文件)。下面给出的是本实验使用到的API的功能和使用方法简单介绍。(1) CreateThreadl 功能创建一个在调用进程的地址空间中执行的线程l 格式HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes,DWORD

3、 dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParamiter,DWORD dwCreationFlags,Lpdword lpThread );l 参数说明lpThreadAttributes指向一个LPSECURITY_ATTRIBUTES(新线程的安全性描述符)。dwStackSize定义原始堆栈大小。lpStartAddress指向使用LPTHRAED_START_ROUTINE类型定义的函数。lpParamiter定义一个给进程传递参数的指针。dwCreationFlags定义控制线程创建的附加标志。lpTh

4、read保存线程标志符(32位)(2) CreateMutexl 功能创建一个命名或匿名的互斥量对象l 格式HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes,BOOL bInitialOwner,LPCTSTR lpName);l 参数说明lpMutexAttributes必须取值NULL。bInitialOwner指示当前线程是否马上拥有该互斥量(即马上加锁)。lpName互斥量名称。(3) CreateSemaphorel 功能创建一个命名或匿名的信号量对象l 格式HANDLE CreateSemaphore(LPSECU

5、RITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount, LPCTSTR lpName );l 参数说明lpSemaphoreAttributes必须取值NULL。lInitialCount信号量的初始值。该值大于等于0,但小于等于lMaximumCount指定的最大值。lMaximumCount信号量的最大值。lpName信号量名称。(4) WaitForSingleObjectl 功能使程序处于等待状态,直到信号量hHandle出现(即其值大于0)或超过规定的等待时间l 格式DWORD Wa

6、itForSingleObject(HANDLE hHandle, DWORD dwMilliseconds);l 参数说明hHandle信号量指针。dwMilliseconds等待的最长时间(INFINITE为无限等待)。(5) ReleaseSemaphorel 功能对指定信号量加上一个指定大小的量。成功执行则返回非0值l 格式BOOL ReleaseSemaphore(HANDLE hSemaphore,LONG lReleaseCount,LPLONG lppreviousCount );l 参数说明hSemaphore信号量指针。lReleaseCount信号量的增量。lpprevi

7、ousCount保存信号量当前值。(6) ReleaseMutexl 功能打开互斥锁,即把互斥量加1。成功调用则返回0l 格式BOOL ReleaseMutex(HANDLE hMutex);l 参数说明hMutex互斥量指针。四、示例程序/定义一个结构体用于存储线程的信息struct ThreadInfoint serial; /线程号char entity; /线程类别(生产者或消费者)double delay; /等待时间double persist; /操作时间;/生产者void Producer(void *p) /定义变量用于存储当前线程的信息DWORD m_delay;DWORD

8、 m_persist;int m_serial;/从参数中获得信息m_serial=(ThreadInfo*)(p)-serial;m_delay=(DWORD)(ThreadInfo*)(p)-delay *INTE_PER_SEC);m_persist=(DWORD)(ThreadInfo*)(p)-persist *INTE_PER_SEC);while( running )/P操作cout生产者线程 m_serial 请求生产.endl;WaitForSingleObject(g_hEmptySemaphore,INFINITE); cout生产者线程 m_serial 请求独占缓冲区

9、.endl;WaitForSingleObject(g_hMutex,INFINITE); Sleep(m_delay); /延迟等待/生产一个产品cout生产者线程 m_serial 生产 +ProductID 号产品成功. endl;cout生产者线程 m_serial 请求将产品 ProductID 投入缓冲区.endl;/把新生产的产品放入缓冲区 g_bufferin = ProductID;in = (in+1)%SIZE_OF_BUFFER;Sleep(m_persist);/操作等待cout生产者线程 m_serial 将产品 ProductID 投入缓冲区中成功.endl;/输

10、出缓冲区当前的状态 cout*endln当前缓冲区情况如图(代表已有产品,代表没有产品): endl;for (int i = 0;i0 )cout;elsecout;coutnn*nserial ;m_delay=(DWORD)(ThreadInfo*)(p)-delay *INTE_PER_SEC);m_persist=(DWORD)(ThreadInfo*)(p)-persist *INTE_PER_SEC);while( running )/P操作cout消费者线程 m_serial 请求消费.endl;WaitForSingleObject(g_hFullSemaphore,INFI

11、NITE);cout消费者线程 m_serial 请求独占缓冲区.endl;WaitForSingleObject(g_hMutex,INFINITE); Sleep(m_delay); /延迟等待/从缓冲区中取出一个产品 cout消费者线程 m_serial 请求取出一个产品.endl;ConsumeID = g_bufferout;g_bufferout=0;out = (out+1)%SIZE_OF_BUFFER;cout消费者线程 m_serial 取出产品 ConsumeID 成功.endl;/消耗一个产品cout消费者线程 m_serial 开始消费消费产品 ConsumeID.e

12、ndl;Sleep(m_persist); cout消费者线程 m_serial 消费产品 ConsumeID 成功.endl; /输出缓冲区当前的状态 cout*endln当前缓冲区情况如图: endl;for ( int i= 0;i0 )cout;elsecout;coutnn*nendl;/V操作ReleaseMutex(g_hMutex); ReleaseSemaphore(g_hEmptySemaphore,1,NULL); 五、实验结果六、实验结果分析1、记录生产者和消费者的同步执行过程线程号线程类别延迟时间操作时间操作请求缓冲区请求生产(消费)结果1P12请求生产请求独占(在2

13、前)生产成功2P26请求生产请求独占未生产3C45请求消费无未消费4C56请求消费无未消费5C32无无未消费2、 分析Producer函数和Consumer函数的功能,并画出对应的程序流程图。Producer函数:通过用变量提取保存提取当前资源信息,然后判断是否执行,接着发出生产请求,请求通过后独占缓冲区资源,接着生产一个产品投入缓冲区,成功后释放所占缓冲区资源,到此此函数执行完成。Consumer函数:也是通过用变量提取保存提取当前资源信息,然后判断是否执行,接着发出消费请求,请求通过后独占缓冲区资源,接着消费一个产品取出缓冲区,成功后释放所占缓冲区资源,到此此函数执行完成。Producer函数: Consumer函数:3、试将同步和互斥的P操作颠倒次序执行,观察并分析程序的运行情况。答:程序产生死锁。程序无法正常运行下去,因为同步和互斥的P操作颠倒次序,即先独占缓冲区资源,后发送请求,因为先独占缓冲区资源,若生产(消费)请求无法通过则一直等待,无法释放资源,因而程序死锁,无法运行了。

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服