CreateMutex和WaitForSingleObject组合的有关问题

CreateMutex和WaitForSingleObject组合的问题
在网上看见一个dll的代码,其中有这样几行 
case   DLL_PROCESS_ATTACH:   
........ 
hmutex=CreateMutex(NULL,FALSE,NULL);//1 
WaitForSingleObject(hmutex,INFINITE);//2 
...... 
ReleaseMutex//3 

按照我的理解,程序应该停在2处,因为其他地方没有ReleaseMutex,所以对代码的意义感到很奇怪,后来自己写了一个EXE 
hmutex=CreateMutex(NULL,FALSE,NULL);//1 
WaitForSingleObject(hmutex,INFINITE);//2 
Printf( "result ")//3 
结果是很顺利的输出了result,请教原因!谢谢!

------解决方案--------------------------------------------------------
第一,CreateMutex时,第二个参数为FALSE,表示创建者不占有Mutex。这时Mutex的状态是有信号的,所有的wait function将返回。如果第二个参数为TRUE,表示创建者占有了Mutex,这时Mutex的状态是无信号的。其它线程中的wait function将阻塞。 

第二,Mutex用于线程之间的同步,在同一线程中执行你上面的语句,不论第二个参数为TRUE或FALSE,wait function都是返回的。 

也就是说如果你在第1个线程里执行 
hmutex=CreateMutex(NULL,TRUE,NULL);//1 
而在另一个线程中执行 
WaitForSingleObject(hmutex,INFINITE);//2 
如果第一个线程不ReleaseMutex(),第二个线程将一直被阻塞。


// 
// lpMutexAttributes:安全属性。(通常为NULL)
// bInitialOwner:互斥量初始状态;触发状态(false),互斥量对象的线程id和递归计数都是0,不被任何线程占用;未触发状态(true),对象线程
    id将被设为调用线程的线程id,递归计数将被设为1。(通常为false)
// lpName:内核对象名称
WINBASEAPI
__out_opt
HANDLE
WINAPI
CreateMutexA(
    __in_opt LPSECURITY_ATTRIBUTES lpMutexAttributes,
    __in     BOOL bInitialOwner,
    __in_opt LPCSTR lpName
);
WINBASEAPI
__out_opt
HANDLE
WINAPI
CreateMutexW(
    __in_opt LPSECURITY_ATTRIBUTES lpMutexAttributes,
    __in     BOOL bInitialOwner,
    __in_opt LPCWSTR lpName
);
#ifdef UNICODE
#define CreateMutex  CreateMutexW
#else
#define CreateMutex  CreateMutexA
#endif // !UNICODE

// dwFlags:0表示bInitialOwner的false,CREATE_MUTEX_INITIAL_OWNER表示true
// dwDesiredAccess:访问权限
WINBASEAPI
__out_opt
HANDLE
WINAPI
CreateMutexExA(
    __in_opt LPSECURITY_ATTRIBUTES lpMutexAttributes,
    __in_opt LPCSTR lpName,
    __in     DWORD dwFlags,
    __in     DWORD dwDesiredAccess
);
WINBASEAPI
__out_opt
HANDLE
WINAPI
CreateMutexExW(
    __in_opt LPSECURITY_ATTRIBUTES lpMutexAttributes,
    __in_opt LPCWSTR lpName,
    __in     DWORD dwFlags,
    __in     DWORD dwDesiredAccess
);
#ifdef UNICODE
#define CreateMutexEx  CreateMutexExW
#else
#define CreateMutexEx  CreateMutexExA
#endif // !UNICODE

// 释放互斥量。
// hMutex:内核对象句柄
WINBASEAPI
BOOL
WINAPI
ReleaseMutex(
    __in HANDLE hMutex
);

// 访问互斥量对象。(当访问权线程不再需要访问资源时,必须调用)
// dwDesiredAccess:访问权限。(通常为SEMAPHORE_ALL_ACCESS)
// bInheritHandle:继承性。(通常为false)
// lpName:内核对象名称。
WINBASEAPI
__out_opt
HANDLE
WINAPI
OpenMutexA(
    __in DWORD dwDesiredAccess,
    __in BOOL bInheritHandle,
    __in LPCSTR lpName
);
WINBASEAPI
__out_opt
HANDLE
WINAPI
OpenMutexW(
    __in DWORD dwDesiredAccess,
    __in BOOL bInheritHandle,
    __in LPCWSTR lpName
);
#ifdef UNICODE
#define OpenMutex  OpenMutexW
#else
#define OpenMutex  OpenMutexA
#endif // !UNICODE

转载于:https://www.cnblogs.com/railgunman/p/6713119.html

【多线程之二】CreateMutex()互斥体 CreateMutex()函数可用来创建一个有名或无名的互斥量对象,其函数原型为: 百度里这样对3个参数进行了定义,很难看懂,还 HANDLE CreateMutex( LPSECURITY_ATTRIBUTESlpMutexAttributes, // 指向安全属性的指针 BOOLbInitialOwner, // 初始化互斥对象的所有者 LPCTSTRlpName // 指向互斥对象名的指 阅读详情

相关推荐

Gradient Accumulation 梯度累加/梯度累积 (Pytorch)

我们在训练神经网络的时候,batch_size的大小会对最终的模型效果产生很大的影响。一定条件下,batch_size设置的越大,模型就会越稳定。batch_size的值通常设置在 8-32 之间,但是当我们做一些计算量需求大的任务(例如语义分割、GAN等)或者输入图片尺寸太大的时候,我们的batch size往往只能设置为2或者4,否则就会出现 “CUDA OUT OF MEMORY” 的不可抗力报错。 那么如何在有限的计算资源的条件下,训练时采用更大的batch size...

hxxjxw的博客 5808

CreateMutex用法

CreateMutex CreateMutex()函数用来创建一个有名或无名的互斥量对象,其函数原型为: HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCTSTR lpName ); 参数 lpMutexAttri...

甜筒八部 的专栏 1万+

深信服aCloud虚拟存储VS3.0实战:从数据分片到仲裁机制的全流程解析

本文深度解析了深信服aCloud虚拟存储VS3.0的核心架构与生产级实践。从数据分片、条带化写入、多副本机制到智能缓存分层,详细阐述了其如何实现高性能与高可靠性的平衡。同时,深入剖析了动态均衡、平滑扩容以及故障恢复与仲裁机制,为运维人员和技术决策者提供了在超融合基础架构(HCI)中部署和管理虚拟存储的实战指南。

net55的博客 588

CreateMutex用法详解

HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes, // 指向安全属性的指针 BOOL bInitialOwner, // 初始化互斥对象的所有者 LPCTSTR lpName // 指向互斥对象名的指针 ); 1.  CreateMutex只是创建了一把锁,  这把锁你用来锁门还是锁抽屉还是锁

xialianggang1314的博客 5万+

opencv案例实战——银行卡模式匹配识别

在之前的几篇文章中我们已经介绍了opencv的一些基础知识,本篇文章我们将结合一个案例运用之前的知识并且学习opencv中模式匹配的应用,用到的知识点如果有不清楚的可以查看上面列出来的系列文章。具体代码会放在最后。

艾醒的博客 1339

AIPex:AI + 自然语言驱动的浏览器自动化扩展

AIPex是一款革命性的Chrome扩展,通过AI技术实现自然语言驱动的浏览器自动化。它支持30多种自动化工具,包括智能标签页管理(分组、切换、批量操作)、页面内容提取(文本、链接、元数据)、交互元素操作(点击、滚动)以及表单智能填写等功能。用户只需用自然语言下达指令,即可快速完成复杂的浏览器操作,大幅提升工作效率。AIPex特别适合需要处理大量重复性网页操作的用户,如数据分析师、产品经理等。

blues_C的博客 1127

《Windows via C/C++》学习笔记 —— 内核对象的“线程同步”之“等待函数”

  用户模式的线程同步机制效率高,如果需要考虑线程同步问题,应该首先考虑用户模式的线程同步方法。   但是,用户模式的线程同步有限制,对于多个进程之间的线程同步,用户模式的线程同步方法无能为力。这时,只能考虑使用内核模式。   Windows提供了许多内核对象来实现线程的同步。对于线程同步而言,这些内核对象有两个非常重要的状态:“已通知”状态,“未通知”状态(也有翻译为:受信状态,未受信...

weixin_30300225的博客 2078

深度解析机器人关节位置环控制:从理论到实践

本文系统阐述了机器人关节位置环控制的核心原理与实现方法。首先介绍了关节控制的基础框架,阐明位置环在闭环控制中的关键作用。随后深入解析PID控制算法原理,包括比例、积分、微分项的功能与参数整定原则。在软件实现部分,提供了模块化设计思路和Python伪代码示例,强调实时性保障和异常处理机制。文章还包含典型面试问题解答和应用案例,展示如何通过参数优化将定位精度提升20倍。最后指出未来发展趋势将聚焦算法自适应性和系统稳健性。全文兼顾理论深度与实践指导,为开发者提供从基础到进阶的完整技术路线图。

郑伟强dev的专栏 50

CreateMutex WaitForSingleObject ReleaseMutex使用

HANDLE CreateMutex(  LPSECURITY_ATTRIBUTES lpMutexAttributes,//  BOOL bInitialOwner,  // flag for initial ownership  LPCTSTR lpName     // pointer to mutex-object name  );

luliyuan的专栏 1万+

如何构建一个 AI 驱动的数据分析系统

在现代数据分析中,将 AI 引入数据分析系统中可以极大提升效率和自动化程度。本文将从架构设计、工具选择、实现步骤等多个方面进行详细说明,帮助你构建一个 AI 驱动的数据分析系统。

晴天彩虹雨的博客 703

基于YOLOv8的水果新鲜程度检测系统设计与实现

数据采集与预处理模块:负责收集水果图像数据并进行标注和增强深度学习模型:基于YOLOv8的目标检测模型新鲜度评估模块:根据检测结果评估水果新鲜程度用户界面:提供友好的交互界面系统集成:将各模块整合为完整系统水果新鲜程度检测需要包含多种水果在不同新鲜度状态下的图像数据集。:包含5种常见水果(苹果、香蕉、橙子、葡萄、草莓)在不同新鲜度下的图像包含约8,000张图像,分为新鲜和腐烂两类AgriVision:大型农业图像数据集,包含水果检测和分类任务Fruit-360:包含120种水果的高质量图像。

YOLO 444

CreateMutex、WaitForSingleObject、ReleaseMutex——创建互斥对象

CreateMutex CreateMutex作用是找出当前系统是否已经存在指定进程的实例。如果没有则创建一个互斥体。 互斥对象是系统内核维护的一种数据结构,它保证了对象对单个线程的访问权 互斥对象的结构:包含了一个使用数量,一个线程ID,一个计数器 使用数量是指有多少个线程在调用该对象,线程ID是指互斥对象维护的线程的ID 计数器表示当前线程调用该对象的次数 声明 HANDLE CreateMu...

u011555996的博客 1635

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

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

CreateMutex和WaitForSingleObject

当你调用 WaitForSingleObject 等待一个互斥体时,并不是说这个函数自己去修改互斥体的内部状态,而是说互斥体本身设计就有这样的行为——当它被某个线程成功获取后,互斥体就会变为“无信号”状态(即被占用状态),这是互斥体的固有特性,而不是由 WaitForSingleObject 主动去改变的。当一个线程调用 WaitForSingleObject 并成功获取互斥体时,互斥体就会自动从“有信号”状态变成“无信号”状态,这样其他线程就会被阻塞直到该互斥体被释放。这是互斥体本身工作方式的一部分。

zhj18679130613的博客 412

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

CreateMutex、WaitForSingleObject、ReleaseMutex

我们对线程做一些简单的同步处理,这里我们用互斥量(Mutex)。 互斥量(Mutex)和二元信号量类似,资源仅允许一个线程访问。与二元信号量不同的是,信号量在整个系统中可以被任意线程获取和释放,也就是说,同一个信号量可以由一个线程获取而由另一线程释放。而互斥量则要求哪个线程获取了该互斥量锁就由哪个线程释放,其它线程越俎代庖释放互斥量是无效的。 在使用互斥量进行线程同步时会用到以下几个函数: HANDLE WINAPI CreateMutex( LPSECURITY_ATTRIBUTES lpMute

物联网小镇的博客 2227

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Windows多线程编程实战:用CreateMutex和WaitForSingleObject解决售票系统并发问题

本文通过构建一个模拟多终端售票系统的实战案例,详细讲解了如何使用Windows API中的CreateMutex和WaitForSingleObject函数实现互斥锁,以解决多线程环境下的资源竞争与数据一致性问题。文章深入解析了核心API的用法,并提供了完整的代码示例和进阶最佳实践,帮助开发者掌握Windows平台线程同步的核心技术。

y7z8a9的博客 435

VS C++ 互斥量 CreateMutex

创建一个有名和匿名的互斥锁HANDLE CreateMutex(      LPSECURITY_ATTRIBUTES lpMutexAttributes, // pointer to security attributes      BOOL bInitialOwner,  // flag for initial ownership      LPCTSTR lpName       // po...

Geek猫的专栏 4262

C++使用CreateMutex

一、定义 HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes, // 指向安全属性的指针 BOOL bInitialOwner, // 初始化互斥对象的所有者 LPCTSTR lpName // 指向互斥对象名的指针 ); 第一个参数是一个指向SECURITY_ATTRIBUTES结构体的指针,一般的情况下,可以是nullptr。 第二个参数类型为BOOL,表示互斥锁创建出来后是否被当前线程持有。 第三个参数类型为字符串(con

sinat_31608641的博客 1891

Win32-进程锁-进程异步-进程互斥-CreateMutex-OpenMutex-WaitForSingleObject-ReleaseMutex

功能WaitForSingleObject函数用来检测hHandle事件的信号状态,在某一线程中调用该函数时,线程暂时挂起,如果在挂起的dwMilliseconds毫秒内,线程所等待的对象变为有信号状态,则该函数立即返回;参数说明访问互斥资源前应该要调用等待函数,结束访问时就要调用ReleaseMutex()来表示自己已经结束访问,其它线程可以开始访问了。某一个进程中的线程创建互斥量后,其它进程中的线程就可以通过这个函数来找到这个互斥量。函数访问值成功返回一个表示互斥量的句柄,失败返回NULL。...

插件开发 3411

CreateMutex函数

CreateMutex CreateMutex函数的作用是找出当前系统是否已经存在指定进程的实例,如果没有则创建一个互斥体。 //VC声明 HANDLE CreateMutex( LPSECURITY_ATTRIBUTESlpMutexAttributes, // 指向安全属性的指针 BOOLbInitialOwner, // 初始化互斥对象的所有者 LPCTSTRlpName // 指向互斥对象名的指针 ); 一个应用: HANDLE hMutex; hMutex = CreateMutex(

S_BlueSky的博客 1833

c++ 进程锁 WaitForSingleObject emutex

1.函数 CreateMutex()//创建一个互斥体 OpenMutex()//打开一个互斥体 WaitForSingleObject()//尝试加锁 ReleaseMutex()//解锁 2.代码 a) 文件 emutex.h #include <windows.h> //进程锁,不支持 linux class emutex { public: bool creat...

u013659062的博客 1716
上一篇: SqlServer 递归查询树形数据
下一篇: Delphi CreateMutex 防止程序多次运行
aowo7144
博客等级 码龄10年 5粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值