- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Windwos下的线程互斥和同步
?
关键字: Windows、线程、互斥、同步
摘要:分析了“互斥”与“同步”在概念上的差异,简单介绍了Windows平台下的互斥、同步机制,详细讨论了生产者-消费者模型及其变形,以及容易出错的方面。
?
概述
网络多媒体应用系统同时包括网络传输、媒体采集和显示、媒体数据编解码、人机接口等多个紧密联系而又相对独立的组成部分,各部分之间需要并行协作才能正常运行,因此大量采用了多线程的运行模式。多线程模式对资源的访问提出了特殊要求。本文分析了线程“互斥”与“同步”在概念上的差异,简单介绍了Windows平台下的互斥、同步机制,详细讨论了生产者-消费者模型及其变形,以及容易出错的方面。
?
互斥与同步
互斥和同步是两个紧密相关而又容易混淆的概念。
互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源,如“第一类读写者模型”。
?
Windows下的互斥同步机制
Windows下提供了多种内核对象实现线程、进程间的同步和互斥,常用的有:
关键节(Critical Section):关键节不是内核对象,在用户态实现了同一进程中线程的互斥。由于使用时不需要从用户态切换到核心态,所以速度很快(X86系统上约为20个指令周期),但其缺点是不能跨进程同步,同时不能指定阻塞时的等待时间,只能无限等待。
互斥体:(Mutex):互斥体实现了和关键节类似的互斥功能,但区别在于:互斥体是内核对象,可以实现跨进程互斥,但需要在用户态和核心态之间切换,速度比关键节慢得多(X86系统上约为600个指令周期),同时可以指定阻塞时的等待时间。
事件(Event):事件也是内核对象,具有“信号态”和“无信号态”两种状态。当某一线程等待一个事件时,如果事件为信号态,将继续执行,如果事件为无信号态,那么线程被阻塞。线程能够指定阻塞时的等待时间。
信号量(Semaphore):信号量是一个资源计数器,当某线程获取某信号量时,信号量计数首先减1,如果计数小于0,那么该线程被阻塞;当某县城释放某信号量时,信号量计数首先加1,如果计数小于或等与0,那么唤醒某被阻塞的线程并执行之。对信号量的总结如下:
1.????????????? m大于0,表示还有m个资源可以访问,此时信号量线程等待队列中没有线程被阻塞,新的线程访问资源也不会被阻塞;
2.????????????? m等与0,表示没有资源可以访问,此时信号量线程等待队列中没有线程被阻塞,但新的线程访问资源会被阻塞;
3.????????????? m小于0,表示没有资源可以访问,此时信号量线程等待队列中有abs(m)个线程被阻塞,新的线程访问资源会被阻塞;
信号量常被用于保证对多个资源进行同步访问。
?
生产者-消费者模型
生产者-消费者模型是指:
1.?
2.?
3.?
4.?
总之,就是生产者群体或消费者群体内部是互斥的,两个群体之间是同步的。
?
当只有一个生产者、消费者时,由于同一群体内部不需要互斥,所以只需在群体之间实 现同步即可。例如可以使用两个Event/CriticalSection/Mutex/Semaphore实现同步;
?
如果有多个生产者和消费者,那么情况会复杂些,需要一个Event/CriticalSection/Mutex实现线程之间的互斥,需要两个Semaphore实现两个线程群体间的同步。一个例子如下:
HANDLE m_S_Producer; // Semaphore
HANDLE m_S_Consumer; // Semaphore
HANDLE m_E_Queue; // Event
?
// 假设仓库最多容纳M个物品,开始仓库为空
m_S_Producer = CreateSemaphore(NULL, M, M, NULL); //初始计数为M
m_S_Consumer = CreateSemaphore(NULL, 0, M, NULL); //初始计数为0
m_E_Queue = CreateEvent(NULL, FALSE, TRUE, NULL); //自动类型,初始状态为信号态
?
生产者
if (WaitForSingleObject(m_S_Producer, WaitTime) == WAIT_OBJECT_0)
{
if (WaitForSingleObject(m_E_Queue, WaitTime) =
您可能关注的文档
- 国家农业科技创新及集成示范基地规划示范讲解.pdf
- 基于一阶剪切变形理论新型复合材料层合板单元.pdf
- 激光显示和发展方向.pdf
- Final Cut Pro X简介和基本使用技巧.doc
- 会计信息失真和其治理.doc
- 您未被授权查看该页解决办法.doc
- VB中DataGrid 控件使用一得.doc
- 二氧化碳激光器和其应用.doc
- VFP试卷和答案4.doc
- 人教版六年级上册语文日积月累与解释.doc
- 新高考生物二轮复习讲练测第6讲 遗传的分子基础(检测) (原卷版).docx
- 新高考生物二轮复习讲练测第12讲 生物与环境(检测)(原卷版).docx
- 新高考生物二轮复习讲练测第3讲 酶和ATP(检测)(原卷版).docx
- 新高考生物二轮复习讲练测第9讲 神经调节与体液调节(检测)(原卷版).docx
- 新高考生物二轮复习讲练测第11讲 植物生命活动的调节(讲练)(原卷版).docx
- 新高考生物二轮复习讲练测第8讲 生物的变异、育种与进化(检测)(原卷版).docx
- 新高考生物二轮复习讲练测第5讲 细胞的分裂、分化、衰老和死亡(讲练)(原卷版).docx
- 新高考生物二轮复习讲练测第5讲 细胞的分裂、分化、衰老和死亡(检测)(原卷版).docx
- 新高考生物二轮复习讲练测第12讲 生物与环境(讲练)(原卷版).docx
- 新高考生物二轮复习讲练测第11讲 植物生命活动的调节(检测)(原卷版).docx
文档评论(0)