利用互斥实现线程共享变量通信.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
利用互斥实现线程共享变量通信

利用互斥实现线程共享变量通信 1.1意义 掌握线程创建和终止,加深对线程和进程概念的理解,会用同步与互斥方法实现线程之间的通信。 1.2要求 软件界面上点“创建线程” 按钮,创建三个生产者线程(P1,P2,P3)和两个消费者线程(C1,C2),生产者和消费者线程共享一个长度为2KB的环型公共缓冲区,生产者向其中投放消息,消费者从中取走消息。只要缓冲区未满,生产者可将消息送入缓冲区;只要缓冲区未空,消费者可从缓冲区取走一个消息。 每个消息具下列结构格式: 消息头(1B,固定为0xaa),消息长度(1B),消息内容(nB),校验和(1B),检验和计算方式为消息长度和消息内容所有字节异或结果。 每个生产者每隔n毫秒(n用随机数产生,1到100毫秒之间,间隔不固定)生产一个消息加入缓冲区,并把消息产生时间和内容记录在一个文本文件中(或显示在列表框中)。P1每次生产的数据为26个大写字母, P2每次生产的数据为26个小写字母,P3每次生产的数据为10个数字。 每个消费者每隔n秒(n用随机数产生,1到5秒之间,间隔不固定)从缓冲区取走一个消息。每消费一个消息需要将消费时间和消息内容记录在一个文本文件中(或显示在列表框中)。 当用户按结束按钮时结束5个线程,并将5个文件内容显示出来进行对照。 如下图所示: 1数据定义 设计PV操作算法,用信号量机制实现生产者与消费者同步与互斥问题,并与无PV情况下进行对比。定义20个缓冲区,将其初始化为0。调用随机函数rand()生成随机数,把随机数通过生产者放入缓冲区。若缓冲区满则其值非0。当消费者从缓冲区中去数后缓冲区值变为0。程序可显示缓冲区中的全部内容,方便观察生产者与消费者的行为。程序可通过设置sleep(time)中time的值来控制生产者与消费者的执行顺序。 2实现思想 我们把系统中使用某一类资源的进程(线程)称为该资源的消费者,而把释放同类资源的进程称为该资源的生产者。基于这一问题,我们将使用生产者和消费者这一同步机制算法来处理该问题. 3设计流程 首先,我们知道,生产者—消费者问题是一个同步问题。即生产者和消费者之间应满足如下条件: 2.1 消费者想接收数据时,有界缓冲区中至少有一个单元是满的。 ? 2.2 生产者想发送数据时,有界缓冲区中至少有一个单元是空的。 ? 创建进程模拟生产者消费者 4 程序流程图 有消费请求? 此请求可满足? 确定产品位置 此产品正被消费? 进入临界区(对同一产品进行请求的消费者之间互斥) 消费产品、并判断是否应该释放产品所占缓冲区 结束消费者进程 生 产 者 阻塞 阻塞 存在空缓冲区 另一生产者正在写? 阻塞 阻塞 Y N Y 消 费 者 退出临界区 进入临界区 从空缓冲区中为本生产者分配一个空间 退出临界区 在该缓冲区中写入产品 通过信号量通知等待本产品的消费者 结束生产者进程 N 图 3-1 程序流程图 4关键代码分析 本程序采用了MFC可视化界面来完成,现在给出关键代码来分析. 4.1开始创建线程 原代码: void CMultiThreadDlg::OnStart() //开始创建线程 { hMutex=CreateMutex(NULL,FALSE,NULL);//创建互斥对象 threadController=1; check=TRUE;//检测标识 HWND hWnd=GetSafeHwnd();//得到控制权 AfxBeginThread(ThreadProc,hWnd,THREAD_PRIORITY_NORMAL);//启用生产者线程1(P1) AfxBeginThread(ThreadProc2,hWnd,THREAD_PRIORITY_NORMAL);//启用生产者线程2(P2) AfxBeginThread(ThreadProc3,hWnd,THREAD_PRIORITY_NORMAL);//启用生产者线程3(P3) AfxBeginThread(Thread_consumer,hWnd,THREAD_PRIORITY_NORMAL);//启用消费者线程1(S1) AfxBeginThread(Thread_consumer2,hWnd,THREAD_PRIORITY_NORMAL);//启用消费者线程2(S2) } 原码功能:主要创建生产者和消费者线程,创建互斥对象,创建窗体对象. 主要函数功能: 4.1.2 CreateMutex() 函数功能:该函数是创建有名或者无名的互斥对象。 函数原型: HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCTSTR lpName); 参数:lp

文档评论(0)

haihang2017 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档