windows同步对象小结

Unity DOTS物理引擎深度对比:DOTS Physics与Havok Physics性能实测与选型指南 物理引擎是现代游戏和实时模拟应用的核心组件,负责处理物体运动、碰撞检测与响应等基础物理模拟。其原理基于牛顿力学与数值积分,通过约束求解器计算物体间的相互作用。在数据导向技术栈(DOTS)架构下,物理引擎的技术价值在于实现大规模实体模拟的高性能与确定性。Unity DOTS Physics作为原生集成方案,通过ECS数据同构与Burst编译器实现极致优化;而Havok Physics作为专业中间件,则提供经过数十年验证的稳定求解器与高级功能。本文基于大规模动态刚体模拟与复杂约束场景的实测数据,深入对比两者在性 阅读详情
在windows平台下,用于对多线程(包括进程)之间的同步保护机制,基本上有这么几种:
1)Critical Section对象 2)Event对象 3)Mutex对象 4)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平台上没有这样的读写锁,你需要自己去实现。
对以上总结如图:


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

零基础学GPU KMD--10. 中断与事件处理:GPU 状态的实时反馈​10.3 事件通知:向用户态传递完成信号(Windows DPC、Linux eventfd) 对 D3D12 Fence,KMD 在 DPC 中更新 Fence 值,并触发与该 Fence 关联的 KEVENT,用户态通过。ISR 快速清除中断标志,标记 fence/semaphore 为 signaled,然后请求 DPC。事件对象在内核中维护,用户态通过句柄引用,生命周期要小心管理(避免悬空句柄)。是 GPU 驱动“闭环”的关键:从硬件完成,到内核感知,再到用户态恢复执行。,与 DRM syncobj 配合,实现高效的跨进程、多队列事件通知。,与 DXGK Fence 机制紧密结合,用户态用。 阅读详情

相关推荐

深入理解MFC线程管理与文件操作

本文还有配套的精品资源,点击获取 简介:MFC(Microsoft Foundation Classes)提供了一套丰富的类库,用于开发Windows应用程序,其中线程管理是关键组成部分。本文详细介绍了如何在MFC中创建和管理线程,包括线程同步、通信机制和文件操作。通过继承 CWinThread 类创建线程,使用 CSemaphore 、 ...

weixin_42174098的博客 1334

Windows中的线程同步

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

m0_61886762的博客 1274

AI 模型训练核心方法论:零基础也能落地的 8 个关键阶段

本文是为 AI 零基础学习者打造的模型训练入门指南,以生活化语言拆解核心概念,规避专业术语壁垒。内容先通俗阐释模型训练、监督学习、数据集划分等基础概念,再按问题定义、数据准备、模型选择、环境搭建、训练、评估、调参、部署 8 个阶段,拆解完整训练流程,搭配 PyTorch 代码示例与实战案例,同时提供资源预算、常见问题解决方案及学习路径。指南强调数据的核心重要性,推荐新手优先使用迁移学习和免费 GPU 资源,兼顾理论与实操,帮助学习者快速上手,避开训练误区,独立完成从模型搭建到部署的全流程。

weixin_52741870的博客 469

windows常用的几种同步对象

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

jimmy ho 1957

从 Pandas 到 Polars 十八:数据科学 2025,对未来几年内数据科学领域发展的预测或展望

Rust 在数据科学家中的普及将受到 Polars 的推动,用户会发现从使用 Python 切换到 Rust API 的门槛相对较低——比从 Pandas 切换到 C 的门槛要低得多!在数据科学蓬勃发展的十年里,我所在领域的日常工作主要由像 Python 这样的动态语言或像 R 和 Julia 这样使用即时编译的语言主导。尽管这两个库的功能有很多重叠,但有些人会想要一个像 DuckDB 这样的工具,它拥有更多关系型数据库的陷阱,而有些人则不会。然而,一位受访者正确地指出,基于GPU的库(如cuDF)更快。

sosogod的博客 2466

vtk相机_分别用 VTK 体绘制和面绘制来实现医学图像三维重建;

序言,VTK介绍:VTK 全称为 The Visualization Toolkit (可视化工具),是一个开源、跨平台、自由获取、支持并行计算的图形应用函数;拥有3D 渲染的最新工具、提供3D交互模式以及2D绘图等。VTK 包含一个C++类库,目前提供了众多语言接口,例如 Java、Python、TCL;在三维函数库OpenGL 的基础上采用面向对象设计方法发展起来图形学基本概念和数据...

weixin_39665302的博客 687

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

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

skywalker_leo的专栏 3499

从零构建物联网监控系统:STM32+迪文屏+WiFi模组的实战解析

本文详细解析了基于STM32微控制器、迪文串口屏和WiFi模组构建物联网监控系统的完整方案。从硬件选型、系统架构设计到数据交互实现,提供了包括迪文屏GUI开发、STM32通信协议、低功耗优化等实战经验,帮助开发者快速掌握物联网监控系统的核心技术。

docker7nomad的博客 728

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

进程同步与互斥 进程通信

qq_66095714的博客 1125

告别regsvr32!易语言调用大漠插件dm.dll的免注册实战(附Win7/10/11避坑指南)

本文详细介绍了易语言如何免注册调用大漠插件dm.dll的实战方法,通过`dmreg.dll`实现真正的免注册调用,规避了传统`regsvr32`注册方式带来的权限和兼容性问题。文章包含核心原理剖析、易语言实现细节、多系统兼容性方案及高级应用场景,帮助开发者实现绿色化部署,提升自动化脚本开发效率。

weixin_42553471的博客 300

Unity 机械臂控制(二)——从碰撞检测到姿态解算:实现精准抓取

本文详细介绍了Unity中机械臂控制的实现方法,从碰撞检测到姿态解算,涵盖精准抓取的全流程。重点讲解了碰撞检测的分层处理、状态机设计、逆向运动学(IK)算法以及抓取稳定性优化等关键技术,并提供了实用的调试技巧和性能优化建议,帮助开发者实现高效的机械臂控制。

weixin_28693447的博客 304

06.Windows线程资源同步对象

在介绍 Windows 线程资源同步对象之前,我们先来介绍一下两个与之相关的、非常重要的函数,即WaitForSingleObject和WaitForMultipleObjects。这个函数的作用是等待一个内核对象,在Windows系统上一个内核对象通常使用其句柄来操作,参数hHandle即需要等待的内核对象,参数dwMilliseconds是等待这个内核对象的最大时间,时间单位是毫秒,其类型是DWORD,这是一个unsigned long类型。

张小方的博客 243

智驾车载以太网(18)-switch之报文转发和vlan处理流程

本文详细解析了交换机中报文处理和转发流程:1)通过目标MAC查找转发端口,源MAC创建ARL条目;2)VLAN标签处理包括tagged/untagged帧判断、默认VID标记等5种处理方式;3)完整转发流程包含CRC校验、IQ封装、VLAN和ARL表查询、端口向量计算及优先级队列发送。文中还涉及TCAM修改VLAN、802.1q多种模式处理等细节,省略了流量控制等次要流程。该过程实现了基于MAC和VLAN的高效二层交换。

mitugaoyang1993的博客 43

Windows同步对象

Windows同步对象小结 Event:         内核对象,跨进程使用时,不能共享句柄,在调用CreateEvent创建命名事件后,用OpenEvent获得句柄后使用   Critical Section:         不是内核对象,不能跨进程使用,不能设置等待时间,也无法获知进入临界区的线程生死状态 Mutex:         内核对象,可跨进程使用,等待时可

overstack的专栏 1064

基于改进YOLO11的天际线检测算法:复杂光照与恶劣天气适配实战

针对特定任务的YOLO改进,不应追求通用SOTA,而应深入理解任务的物理退化机理。Retinex对应光照模型、FAD对应散射模型、Wise-IoU对应边界不确定性——每个改进都有明确的物理解释,而非盲目的模块堆叠。时序一致性:引入轻量级RNN/Transformer模块利用视频帧间信息补偿单帧退化;多模态融合:结合红外/NIR波段穿透雾霾,与可见光特征在FAD-Neck中交叉注意力融合;自监督预训练:在海量无标注天际线视频上用MAE预训练Backbone,缓解恶劣天气标注稀缺问题。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 95

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

[多线程]windows线程小结

线程同步是一个非常大的话题,包括方方面面的内容。从大的方面讲,线程的同步可分用户模式的线程同步和内核对象的线程同步两大类。用户模式中线程的同步方法主要有原子访问和临界区等方法。其特点是同步速度特别快,适合于对线程运行速度有严格要求的场合。   内核对象的线程同步则主要由事件、等待定时器、信号量以及信号灯等内核对象构成。由于这种同步机制使用了内核对象,使用时必须将线程从用户模式切换到内核模式,而这

超越 2011

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

编写可靠的Windows CE代码

编写可靠的本机代码 2003年1月 Nat Frampton(请参阅 Nat 的 eMVP 传记)Real Time Development Corp.Microsoft Embedded MVP 主管适用于:    Microsoft(r) Windows(r) CE .NET    Microsoft(r) eMbedded Visual C++(r)    Microsoft(r

小破猴的专栏 2055

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

windows下c语言互斥锁头文件,互斥类(Cmutex)——MFC

一、关于CMutex类1、CMutex只是对 win32API的互斥操作进行了封装2、它的参数与 win32 API 中的CreatMutex() 相对应3、CMutex的构造函数调用CreatMutex() 创建并检查4、其Lock操作从基类继承,调用WaitForSingleObject()获得所有权,互斥类重载 Unlock调用ReleaseMutex()释放所有权。所以,MFC其实就是简单...

weixin_29310631的博客 1931

WINDOWS+PE权威指南读书笔记(27)

目录 软件安装自动化 基本思路: 补丁程序 patch.exe: 执行线程函数: 简单测试: 消息发送器 _Message.exe: 窗口枚举回调函数: 调用窗口枚举函数: 向指定窗口发送消息: 消息发送器源代码: 测试运行: 消息发送器生成工厂 MessageFactory.exe: 键盘虚拟码: 改进的消息发送器实例分析: 消息发送器生成工厂代码结构: 代码与数据的定位: 提取代码字节码: 软件安装自动化主程序 AutoSetup.exe: 主要代码: 测试运

沐一 · 林 的博客 1150

MFC WaitForSingleObject函数

WaitForSingleObject 函数SyntaxParametersReturn ValueRemarks Waits until the specified object is in the signaled state or the time-out interval elapses. 【等待,直到指定的对象处于信号状态或超时间隔结束。】 To enter an alertable wait state, use the WaitForSingleObjectEx function. To wa

sty_app的博客 1736

操作系统课程设计报告

优快云下载:操作系统课程设计报告     题目:   进程同步实现—生产者和消费者的问题                            学号:                           姓名:                        任课教师:                                   2017年12月摘 要本课程设计利用模拟用信号量机制实现生产...

ESESZB的博客 1万+

WDF驱动开发-同步技术

WDF 同步技术

王马的博客 1269

Windows编程 同步对象和技术

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

zhengjihao的博客 352

Windows进程同步之事件内核对象(Event)

在所有的内核对象中,事件内核对象比其他的简单的多,可以用事件内核对象对不同进程进行同步。 事件内核对象主要包括三个部分:使用计数,一个表示是自动还是手动重置事件的布尔值,一个表示是否有信号的布尔值。 使用计数:和其他内核对象一样,用来标识使用该事件对象的不同线程个数。 表示自动或手动重置事件的布尔值:当一个事件是自动重置事件,事件被触发后,只有一个等待的线程会变成可调度状态(根据系统的调...

jishublog 450
上一篇: 线程延时
下一篇: 信号量Semaphore
雪岢奇
博客等级 码龄17年 310粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值