news 2026/9/23 9:53:56

Win32互斥体

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Win32互斥体

线程锁的限制

CRITICAL_SECTION临界区(线程锁):用户态对象,仅本进程内部线程同步,不能跨进程,遇到跨进程共享资源(共享内存、文件、内核页),临界区就无能为力,需要互斥体 Mutex(内核对象)

互斥体核心概念

  1. 本质:存放在内核中的令牌,属于内核对象,可以跨进程同步
  2. 工作逻辑:
    ● 线程拿到互斥体(获取令牌),进入临界区;互斥体变为无信号
    ● 其它线程调用WaitForSingleObject获取,直接阻塞
    ● 持有线程调用ReleaseMutex()释放,互斥体变回有信号,等待线程被唤醒
  3. 内核对象,用完必须CloseHandle()关闭句柄
    CreateMutex 函数原型:
HANDLECreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes,//安全属性,NULL句柄不可继承BOOL bInitialOwner,//创建者是否直接占有互斥体LPCSTR lpName//互斥体名字,NULL为匿名;有名字就可以跨进程打开);

参数详解

  1. lpMutexAttributes:一般填NULL
  2. bInitialOwner
    ○ TRUE:创建出来互斥体是无信号状态,当前线程直接占有互斥体
    ○ FALSE:创建出来互斥体是有信号状态,任意线程都可以立刻获取
  3. lpName:互斥体名称,命名互斥体可被别的进程通过名字打开;传NULL代表匿名,只能本进程内使用
    ✨互斥体递归特性:同一个线程已经拥有互斥体,可以再次WaitForSingleObject获取,不会死锁;获取多少次,就要对应ReleaseMutex多少次
    释放互斥体:
BOOLReleaseMutex(HANDLE hMutex);

只有当前拥有互斥体所有权的线程,才可以调用 ReleaseMutex 释放

互斥体 vs CRITICAL_SECTION(临界区)高频对比

对比项CRITICAL_SECTION 临界区Mutex 互斥体 (CreateMutex)
对象类型用户态对象,非内核对象内核对象
使用范围仅同一个进程内部线程进程内、跨进程都可以
等待超时不能设置超时,拿不到锁永久阻塞借助 WaitForSingleObject 可以设置超时时间
效率速度快,尽量不进入内核速度慢,一定会切换内核态
线程异常退出线程崩溃不会自动释放锁,其它线程永久卡死持有线程异常终止,系统自动回收互斥体,不会永久死等
关闭销毁DeleteCriticalSection()CloseHandle()

互斥体经典用法:程序防多开

原理:创建命名互斥体
● 如果系统里同名互斥体已经存在:CreateMutex依旧返回有效句柄,GetLastError()返回ERROR_ALREADY_EXISTS(183),说明程序已经跑了一份,直接退出
● 如果不存在,则新建互斥体,正常运行程序

HANDLE hMutex=CreateMutex(NULL,FALSE,L"MyApp_Mutex");DWORD dwErr=GetLastError();if(hMutex!=NULL){if(dwErr==ERROR_ALREADY_EXISTS){//已有实例,退出CloseHandle(hMutex);return0;}}else{//创建失败return0;}//主程序逻辑...//程序退出CloseHandle(hMutex);

注意:防多开只是互斥体的附加玩法,互斥体本职工作是线程 / 进程同步
其它防多开手段:文件锁、共享内存、窗口查找

场景选型

  1. 只做进程内部多线程同步:优先 CRITICAL_SECTION 临界区,性能更高
  2. 跨进程同步:必须使用 Mutex 互斥体

总结

  1. 临界区用户态,不能跨进程;互斥体是内核对象,支持跨进程
  2. bInitialOwner=FALSE:互斥体初始有信号;TRUE创建线程直接占有互斥体,初始无信号
  3. 互斥体可以递归获取;持有线程崩溃,系统自动释放互斥体
  4. 互斥体可以搭配WaitForSingleObject设置等待超时;临界区 EnterCriticalSection 没有超时
  5. 命名互斥体可以实现软件防多开,判断GetLastError()==ERROR_ALREADY_EXISTS
  6. 互斥体内核对象,结束必须CloseHandle;临界区调用DeleteCriticalSection销毁
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/23 9:53:45

上海迪士尼不能带什么最佳实践:搞定Stack Trace报错的避坑指南

上海迪士尼不能带什么最佳实践:搞定Stack Trace报错的避坑指南 盯着满屏红色的 StackTrace,你是不是也想把键盘砸了?那种感觉就像在上海迪士尼排队时,突然被保安拦下说“这个不能带”,你懵了,规则太细,脑子一片空白。别慌,这堆乱码背后其实藏着逻辑,咱们得用最佳实践去拆解它。今天不聊虚的…

作者头像 李华
网站建设 2026/9/23 9:53:45

pku是什么意思在实战项目中如何落地

pku是什么意思在实战项目中如何落地 复制来的代码跑不通不知道怎么调,这种崩溃感每个写过 Java 后端或者搞过教育信息化系统的老哥都懂。特别是当你在 实战项目 里对接高校数据,或者处理类似北大(PKU)这种顶级学府的接口时,发现字段定义模糊,报错信息又全是英文堆砌,真的会让人怀疑人生。…

作者头像 李华
网站建设 2026/9/23 9:53:40

解决网络连不上:手写实现超时重试机制的性能优化实战

解决网络连不上:手写实现超时重试机制的性能优化实战 复制来的代码跑不通,报错信息却只有一行 Connection Timeout ,你盯着屏幕发呆,不知道是该换网络还是改代码。这种时候,盲目重启路由器是最没用的操作。真正的问题往往藏在连接建立、超时配置和错误处理这三个环节里。今天不讲虚的,我们直接通…

作者头像 李华
网站建设 2026/9/23 9:53:25

价值与价值观:面试必问的底层逻辑与代码实现

价值与价值观:面试必问的底层逻辑与代码实现 复制来的代码跑不通不知道怎么调?别急着改配置,先看看你的核心逻辑是不是写歪了。很多后端开发在应对【面试必问】的场景题时,往往卡在“如何量化业务价值”和“如何落地价值观约束”这两个点上。面试官问的不是语法,而是你如何通过代码结构来体现系统的核心价值取向。今天…

作者头像 李华
网站建设 2026/9/23 9:53:25

道德经第二十章拆解3个实战项目避坑指南

道德经第二十章拆解3个实战项目避坑指南 报错一堆看不懂 StackTrace,是不是让你抓狂?在微服务架构的 实战项目 里,这种堆栈信息就像天书。别慌,今天咱们聊聊《道德经第二十章》里的“众人熙熙,如享太牢,如春登台。我独泊兮,其未兆;如婴儿之未孩”,用这章经文透视图,帮你理清微服务中服务间通信、状…

作者头像 李华
网站建设 2026/9/23 9:53:11

MATLAB小波分析在机械故障诊断中的实战应用

1. 项目背景与核心价值机械振动信号分析是工业设备状态监测与故障诊断的黄金标准。作为一名在旋转机械故障诊断领域工作8年的工程师,我深刻理解振动信号中蕴藏的设备健康信息就像一本加密的日记,而小波分析正是破解这本日记的密钥。传统傅里叶变换在分析…

作者头像 李华