Windows同步对象

Windows驱动开发WDM (8)- 内核同步对象 只要写过多线程应用的程序员都知道,多线程访问公共资源的时候需要同步。在用户模式下,经常使用事件,互斥,信号量等对象来控制公共资源的访问。内核模式下,也是有相应的事件,互斥,信号量等内核对象,还有自旋锁。如果不是用同步对象进行控制,那么当多线程访问的时候就会产生一些不可预测的问题了。   不使用同步对象 看下面的代码: NTSTATUS Encoding(IN PDEVICE_OBJECT 阅读详情
Windows同步对象小结
Event:
        内核对象,跨进程使用时,不能共享句柄,在调用CreateEvent创建命名事件后,用OpenEvent获得句柄后使用
 
Critical Section:
        不是内核对象,不能跨进程使用,不能设置等待时间,也无法获知进入临界区的线程生死状态

Mutex:
        内核对象,可跨进程使用,等待时可设定超时。 拥有权属于最后一个进行等待操作的线程,在拥有Mutex的线程结束前如果没有调用ReleaseMutex(),这个Mutex就被
舍弃,其它线程调用Wait..时,将会返回WAIT_ABANDONED_0
 
Semaphore:
        内核对象,可控制多个需要同步的资源
 
同步保护机制的一些明显的行为特征,而这些行为特征,也是我们再写程序时经常会碰到的。

       以下我们所讨论的这些行为特征,是对并发的进/线程之间的同步保护机制的一般描述,本文用windows平台作为一个典型的例子。 基于这一些行为特征,对本文提及的这四种同步对象做一个分类。
另外,在这里,我们把这四种同步对象,统统称为“锁”,以便于接下来的讨论。
第一、保护与同步。
        在这里要强调的是:保护与同步是两个不同的概念。而我们经常会混合这两个概念。保护是指在多线程的环境下对共享资源的保护。这样的共享资源大多数情况下是一段内存块,它会被很多线程试图访问和修改。而同步更多的强调的是线程之间的协作,协同工作是需要同步支持的。
基于这一性质,我们可以看出:Critical Section对象其本质更多的强调的是保护,而Event对象、Mutex对象与Semaphore对象更多的强调的是同步。不过,这样的区别,只是概念上的区别,其本身不会对程序本身产生影响。
第二、锁的等待超时
       在开发并发的多进/线程程序时,为了避免死锁之类的问题,引入了“等超时“的概念,即当一个线程需要获得一个锁来执行某些代码的时候,它可以在所等待的锁上设置超时值。如果在确定的时间(超时值)内无法获得该锁,它可以选择放弃执行该段代码的权利,这样可以在一定程度上避免出现死锁的问题。这就是锁的等待超时的基本含义。基于这一行为特征,我们来对上面四种同步对象做一个划分:Critical Section对象是无法设置等待超时的,而其他三个对象则可以设置等待超时。从这一点来讲,在使用Critical Section对象时,由于在等待进入关键代码段时无法设置等待超时,很容易造成死锁。
第三、线程锁与进程锁
        这里所说的线程锁指的是该锁只在一个进程的所有线程中可见,而进程锁指的是该锁可以被不同的进程所访问,可用于进程间的同步与互斥。当然进程锁仍然可以被用于同一个进程的不同线程之间的同步与互斥。进程锁的概念是大于线程锁的。基于这一特点划分的话,Critical Section对象是线程锁,而其他三个对象是进程锁。这一点从本质上来分析,Critical Section对象是用户态模式下面实现线程同步的方法,而其他三个对象均是内核对象。内核对象机制的适应性远远优于用户方式机制。实际上,内核对象机制的唯一不足之处在于它的速度比较慢,这是因为当调用内核机制对象时,必须从用户方式转到内核方式。这样的转换需要付出很大的代价,是一件很费时的操作。在X86平台上,这样往返一次需要占用1000个CPU周期(这并不包括执行内核方式的代码)。当然需要注意的是:使用Critical Section对象并不意味着线程不会陷入核心态执行。当一个线程试图进入另一个线程拥有的关键代码段时,该线程就会进入等待状态。这意味着:该线程必须从用户态转为核心态。(为了提高这一方面的性能,Microsoft将循环锁的概念纳入到了Critical Section对象中,该线程可以有选择地不进入核心态等待.具体请参阅MSDN)
第四、锁的递归特质
        所谓递归锁指的是当一个线程拥有一个同步锁时,而递归地想再次取得该锁.如果这次获得操作不会阻塞当前线程的执行,则称该锁为递归锁.递归锁主要是在"保护"的概念上提出的,而"保护"概念下的锁包括Critical Section对象和Mutext 对象.这两种锁在Windows平台上都是递归锁。需要注意的是:调用线程获得几次递归锁必须释放几次递归锁。
第五、读写锁
       读写锁允许高效的并发的访问多线程环境下的共享资源。对于一种共享资源,多个线程可以获得读锁,共享地读该共享资源。而在同一时刻,只允许一个线程拥有写锁改变该共享资源.这就是读写锁的概念。很遗憾的是在Windows平台上没有这样的读写锁,你需要自己去实现。
对以上总结如图:

Windows同步对象
Futher Read:
         个人认为,如果你想深入研究多线程的同步机制,ACE是一个绝佳的教材,在这里,你会看到什么是Scoped Lock, 读写锁如何实现等等。
----------------------------------------------------------------------------------------------------------------

同步对象
Windows共设置了4种主要的同步对象,分别是临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphore)和事件(Event)。MFC封装了它们,分别是类CCriticalSection、CMutex、CSemaphore和CEvent,它们都以CSyncObject为基类。

1、临界区
(1)创建:CCriticalSection myCriticalSection;
(2)对临界区加锁:myCriticalSection.Lock();
(3)解锁:myCriticalSection.UnLock();


2、互斥对象
它不仅可以在同一进程的线程之间实现资源的安全共享,而且可以在不用进程的线程之间实现资源的安全共享。
(1)创建:CMutex myMutex;
(2)创建一个CSingleLock对象:CSingleLock singleLock(&myMutex);
(3)得到Mutex对象:singleLock.Lock();
(4)如果其他线程已经拥有了该Mutex对象,那么系统会把该线程挂起来。
(5)释放:singleLock.UnLock();


3、信号量对象
允许多个线程同时访问一个受保护的资源。
(1)创建:CSemaphore myCSemaphore;
CSemaphore=new CSemaphore(5,5);
其中第一个参数为计数器的初始值,第二个参数为计数器的最大值。
(2)使用:CSingleLock singleLock(&myCSemaphore);
(3)减少CSemaphore对象的计数值:singleLock.Lock();
(4)释放CSemaphore对象:singleLock.UnLock();


4、事件对象(Event)
Event对象由CEvent类创建。一个Event对象可以有两种状态:有信号状态和无信号状态。线程通过检测Event对象的状态进行相应的处理。
(1)创建:CEvent StartThread;
(2)创建完之后,Event对象自动处于无信号状态,要给Event对象发送信号:StartThread.SetEvent();
(3)线程通过以下函数来检测事件的信号:
::waitForSingleObject(StartThread.m_hObject,INFINITE);
此函数的两个参数分别是要检测的Event对象的句柄(在该Event对象的m_hObject成员变量中)和等待该信号准备花的时间,INFINITE表示无时间限制即无限期的等待。 


10、Windows内核同步对象的使用与实践 本文深入探讨了Windows内核中的关键同步对象,包括互斥体、信号量、自动和手动重置事件以及可等待定时器的使用与实践。通过详细的原理说明和示例代码,展示了如何利用这些对象实现多线程环境下的线程同步与协调,避免数据竞争和死锁问题。同时,还涵盖了调试内核对象的方法、性能优化策略以及综合应用案例,帮助开发者全面掌握内核对象的使用技巧。 阅读详情

相关推荐

22、线程同步:Windows 同步对象全解析

本文详细解析了Windows系统下的多种线程同步机制,包括互斥量、临界区、信号量和事件。通过对比它们的特性、使用场景及注意事项,帮助开发者选择合适的同步对象,并提供了避免死锁和竞态条件的最佳实践。文章还结合生产者-消费者模型示例,展示了同步对象的具体应用。

bb456的博客 78

Windows同步机制:临界区、互斥对象、事件对象与信号对象

书籍:《Visual C++ 2017从入门到精通》环境:Visual Studio 2022。

felicity_one的博客 914

10、Windows内核同步对象的使用与调试

本文详细介绍了Windows内核中的常见同步对象,包括互斥体、信号量、自动/手动重置事件和可等待计时器,涵盖它们的使用方法、调试技巧以及在多线程编程中的应用场景。通过丰富的代码示例和流程图,帮助开发者深入理解线程同步机制,并合理选择和优化同步对象以提高程序性能和稳定性。

food6的博客 115

Windows中的线程同步

lpCriticalSection Init函数中传入需要初始化的CRITICAL_SECTION对象的地址值,反之Delete函数传入需要接触的CRITICAL_SECTION对象的地址值。

m0_61886762的博客 1274

多线程编程中的Windows条件变量与C++11同步对象

本文深入探讨了在Windows系统中条件变量的使用及特点,以及如何利用C++11提供的线程同步对象来编写跨平台的多线程程序。通过对比Linux条件变量,我们了解到Windows条件变量仅在特定版本后才得到支持,并且是user-mode对象。同时,文章也介绍了在多进程之间共享线程同步对象的技巧,并详细解释了C++11中std::mutex系列及std::lock_guard的使用方法和最佳实践。

weixin_36369848的博客 299

mysql9.0windows安装

将这里的位置修改为你刚刚创建并复制data目录的地址即可,win11的系统使用vscode修改之后,会让你确认开启更高权限以进行保存,比较方便,window10不需要确认,修改后可以直接保存。:在修改之前,最好将下图文件进行备份,将原始的文件保存好一份,以防更改了配置之后,导致mysql服务报错,无法启动,备份好的话直接将有问题的配置文件给替换就可以,无需重新安装一次mySql。双击下载的msi文件进行安装。安装有问题的,可以直接进行卸载,新本的mySql会将注册表中的数据自动进行清除,还是很方便的。

m0_74824123的博客 6444

windows常用的几种同步对象

windows常用的几种同步对象:   1、互斥对象Mutex: 函数: CreateMutex  //有带名字 ReleaseMutex 注:与WaitForSingleObject(mutex,INFINITE);配合使用 功能:因为有带名字,所以可以用来同步不同的进程. 缺点:Mutex对象的操作比较费时.   2、同步对象CriticalSection: 函数:

jimmy ho 1957

硬件开发流程

研发流程在一个有一定规模的企业中起到了非常重要的作用,也是一个产品或者项目成功量产出货依赖的平台体系,作为工程师如果想要走的更远,就必须了解流程体系,了解如何对产品的开发质量进行更好的管控。...

weixin_44126796的博客 8376

Windows支持的4种类型的同步对象:临界区、互斥量、事件和信号量

Windows支持4种类型的同步对象,可以用来同步由并发运行的线程所执行的操作: 临界区互斥量事件信号量     MFC在名为CCriticalSection、CMutex、CEvent和CSemaphore的类中封装了这些对象。下面分别对这些同步对象进行介绍。 临界区     最简单类型的线程同步对象就是临界区。临界区用来串行化对由两个或者多个线程共享的资源的访问。这些线程必须属

skywalker_leo的专栏 3499

海康摄像头V3.4 升级改造VUE3

摘要:本文介绍了一个基于Vue3的海康威视摄像头组件封装方案。针对官方仅提供HTML版本SDK的问题,作者通过封装实现了Vue3组件化集成,解决了iframe/webview引入方式的弊端。组件核心功能包括实时预览、本地录像、录像下载、截图抓拍等,并优化了SDK初始化逻辑(单例模式)、定位问题修复和错误处理机制。关键技术点包括:1)SDK插件容器定位修复;2)录像下载进度监控;3)多格式图片数据处理;4)多窗口场景下的SDK实例管理。该组件可直接通过npm安装使用,提供了完善的API和事件接口,显著提升了海

LINLINLINShi的博客 113

Java使用easyExcel生成excel文件直接写入邮件附件并发送

1.引入pom依赖 <!-- email --> <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</version> </dependency> <!-- easyexcel需要依赖poi jar包 --> <depe

weixin_50493320的博客 3909

进程同步与进程通信(#include <windows.h>)

进程同步与互斥 进程通信

qq_66095714的博客 1125

Qlib上手学习记录

Qlib 是一个面向人工智能的量化投资平台,其目标是通过在量化投资中运用AI技术来发掘潜力、赋能研究并创造价值,从探索投资策略到实现产品化部署。该平台支持多种机器学习建模范式,包括有监督学习、市场动态建模以及强化学习等。真的是走了很多弯路step 1. 使用 ananconda 建立环境,要主要必须是 python 3.8失败的下了以后 进入 glib folder 后执行是会报错的,不管你还什么source 都一样,整了很久使用前最好看下这个。

chenchihwen的专栏 3099

windows同步对象小结

windows同步对象小结        在windows平台下,用于对多线程(包括进程)之间的同步保护机制,基本上有这么几种: 1)Critical Section对象 2)Event对象 3)Mutex对象 4) Semaphore对象。网上已经有很多的文章在介绍这些对象是怎么使用的。本文的着眼点在于:总结出这些同步保护机制的一些明显的行为特征,而这些行为特征,也是我们再写程序时经常会

jfkidear的专栏 741

AutoSAR系列讲解(入门篇)2.2-SWC的类型

该章讲解了两种SWC的分类,并且映射到实际的工程中应该是具体的什么文件类型

雪云飞星的博客 4万+

【Ranger】mac下Apache Ranger编译安装

a、编译过程中出现测试用例不通过和文件认证错误错误:带上参数-DskipTests=true -Drat.skip=true 重新编译;b、若编译过程中出现缺少jar包的情况,可能下载不了,需要手动自动添加;c、编译所需的其他工具如maven等安装配置略。采用这个会报错,因此我才用了下面一个命令。初始化设置Ranger Admin:执行。然后进入target目录。

九师兄 2103

06.Windows线程资源同步对象

需要说明的是,临界区对象通过保护一段代码不被多个线程同时执行,进而来保证多个线程之间读写一个对象是安全的。也就是说,当其中一个线程离开临界区,即使此时有其他线程在这个临界区外面等待,由于线程调度的不确定性,此时正在等待的线程也不会有先进入临界区的优势,它和刚离开这个临界区的线程再次竞争进入临界区是机会均等的。当然,在实际开发中这种方式是靠不住的,线程调度是操作系统内核的策略,应用层上的应用不应该假设线程的调度策略是按预想的来执行,但是理解线程与临界区之间的原理有助于你编写出更高效的代码来。

左雪菲的专栏 1226

YOLOv11 改进 - 注意力机制 | Deformable-LKA 可变形大核注意力:自适应采样网格优化特征捕捉,提升不规则目标感知

本文介绍了可变形大核注意力(D-LKA Attention)及其在YOLOv11中的结合。D-LKA Attention是一种简化的注意力机制,采用大卷积核利用体积上下文信息,通过可变形卷积灵活调整采样网格,适应多样数据模式。它有2D和3D版本,3D版本在跨深度数据理解上表现出色,共同构成了D-LKA Net架构。我们将D-LKA Attention集成进YOLOv11,在模型的检测头部分引入deformable_LKA_Attention模块。实验表明,该方法在分割任务上表现优于现有方法,提升了模型的检测

魔改工程师的博客 1170

Windows的4种主要的同步对象(原)

同步对象Windows共设置了4种主要的同步对象,分别是临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphore)和事件(Event)。MFC封装了它们,分别是类CCriticalSection、CMutex、CSemaphore和CEvent,它们都以CSyncObject为基类。1、临界区(1)创建:CCriticalSection myCritical

893

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Windows同步对象Event和Linux的条件变量

最近在看一些同步对象模拟的东东,特别对在Windows下如何模拟条件变量折腾了很久。 1 Windows同步对象Event 微软有一个很有意思的同步对象,某种程度上和Linux的条件变量很相似。但秉承微软一贯的作风,有些地方设计的又有点怪异。Event通过函数CreateMutex创建,可以分为手动模式和自动模式两种模式,两种模式下表现迥异。和其他同步对象一样,在WaitForSingleOb

C++是促进脑死亡的最佳方式 5753

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Windows编程 同步对象和技术

在多线程编程中,为了保证线程正确的运行,必须进行同步。Windows操作系统支持多种同步对象: 同步对象:互斥量(Mutex) 互斥量的一个重要特性是,只允许一个线程拥有它。 创建一个互斥量对象,可以使用CreateMutex函数HANDLE WINAPI CreateMutex(   LPSECURITY_ATTRIBUTES  lpMutexAttributes,   BOOL  b

zhengjihao的博客 352

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

随笔之POSIX cond和Windows同步对象Event的讨论

为什么80%的码农都做不了架构师?>>> ...

weixin_33737134的博客 89

Windows 线程资源同步对象

由于同一时刻只有一个线程可以进入临界区,因此这种对资源的操作是排他的,即对于同一个临界区对象,不会出现多个线程同时操作该资源,哪怕是资源本身可以在同一时刻被多个线程进行操作,如多个线程对资源进行读操作,这就带来了效率问题。细心的读者会发现上述输出中存在同一个的线程连续两次进入临界区,这是有可能的。也就是说,当其中一个线程离开临界区,即使此时有其他线程在这个临界区外面等待,由于线程调度的不确定性,此时正在等待的线程也不会有先进入临界区的优势,它和刚离开这个临界区的线程再次竞争进入临界区是机会均等的。

一个时代的落幕,一个时代的开启。 152
上一篇: Catalan数(卡特兰数)
下一篇: 在什么时候需要使用“常引用”?
overstack
博客等级 码龄14年 115粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值