- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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
您可能关注的文档
最近下载
- 新人音版二年级音乐下册优秀教学设计《共产儿童团歌》教案.doc VIP
- 肝硬化诊治指南2025年.docx
- 初中数学新人教版八年级上册13综合与实践 确定匀质薄板的重心位置教学课件2025秋.pptx VIP
- 08【人教版英语字帖】八年级上册单词表衡水体字帖(新目标含音标).pdf VIP
- 2023年10月自考06089劳动关系与劳动法押题及答案.pdf VIP
- 新教科版小学科学实验目录五年级上册.docx VIP
- 合理用药用药班会PPT课件.pptx VIP
- 结构设计弯矩二次分配法计算(表格自带公式).xls VIP
- 规范言行从我做起主题班会.pptx
- PanelView Plus 7 Performance 终端用户手册.pdf VIP
文档评论(0)