《Win32多线程程序设计》(4)--- 互斥器(Mutexes)

Win32线程——同步机制 《Win32多线程程序设计》–Jim Beveridge & Robert Wiener同步(synchronous):当程序1调用程序2时,程序1 停下不动,直到程序2完成回到程序1来,程序1才继续下去; SendMessage() 根本就像是“直接调用窗口之窗口函数”,除非等该窗口函数结束,是不会回到原调用点的,所以它是同步行为。 异步(asynchronous):如果程序1调用程序2后,径自继 阅读详情

Win32 的Mutex 用途和critical  section 非常类似,但是它牺牲速度以增加弹性。或许你已经猜到了,mutex 是MU Tual EXclusion 的缩写。一个时间内只能够有一个线程拥有mu tex,就好像同一时间内只能够有一个线程进入同一个critical  section 一样。虽然mu tex 和critical section  做相同的事情,但是它们的运作还是有差别的:


i 锁住一个未被拥有的mu tex,比锁住一个未被拥有的critical  section,需要花费几乎100  倍的时间。因为critical section  不需要进入操作系统核心,直接在“user m ode”就可以进行操作。(译注:作者这里所谓的“user mode”,是相对于Window s NT 的“kernel mode”而言。至于Window s 95 底下,没有所谓“user mode”这个名词或观念,应该是指ring3  层次。)
iMutexes可以跨进程使用。Critical section则只能够在同一个进程中使用。i  等待一个mu tex 时,你可以指定“结束等待”的时间长度。但对于critical section 则不行。
HANDLE CreateMutex( 
LPSECURITY_ATTRIBUTES lpMutexAttributes,
BOOL bInitialOwner,
LPCTSTR lpName
); 
参数
lpMutexAttributes  安全属性。NULL 表示使用默认的属性。这一指定在Window s 95 中无效。
bInitialOwner  如果你希望“调用CreateMutex() 的这个线程”拥有产生出来的mu tex,就将此值设为TRUE。
lpNamemu tex 的名称(一个字符串)。任何进程或线程都可以根据此名称使用这一mu tex。名称可以是任意字符串,
只要不含反斜线(backslash,\)即可。
返回值
如果成功,则传回一个handle,否则传回NULL。调用GetLastError() 可以获得更进一步的信息。如果指定的mu tex 名称已经存在,GetLastError() 会
传回ERROR_ ALREADY_EXISTS。

打开一个互斥器(Mutex)

如果mu tex 已经被产生了,并有一个名称,那么任何其他的进程和线程便可以根据该名称打开那个mu tex(我这里并不考虑安全属性)。
如果你调用CreateMutex() 并指定一个早已存在的mu tex 名称,Win32 会回给你一个m utex handle,而不会为你产生一个新的mu tex。就像上面所说的,GetLastError() 会传回ERROR_ ALREADY_EXISTS。
你也可以使用OpenMutex() 打开(而非产生)一个原已存在的mu tex。

锁住一个互斥器(Mutex)

一旦没有任何线程拥有mu tex,这个mu tex 便处于激发状态。因此,如果没有任何线程拥有那个mu tex,Wait...() 便会成功。反过来说,当线程拥有mutex时,它便不处于激发状态。如果有某个线程正在等待一个未被激发的mutex,它便将进入“blocking”(阻塞)状态。也就是说,该线程会停止执行,直到mu tex 被其拥有者释放并处于激发状态。

1. 我们有一个mu tex,此时没有任何线程拥有它,也就是说,它处于非激发状态(译注)。
2. 某个线程调用WaitForSingleO bject()(或任何其他的Wait... () 函数),并指定该m utex handle 为参数。
3. Win32 于是将该mu tex 的拥有权给予这个线程,然后将此mu tex 的状态短暂地设为激发状态,于是Wait...() 函数返回。
4. Mutex 立刻又被设定为非激发状态,使任何处于等待状态下的其他线程没有办法获得其拥有权。
5. 获得该mu tex 之线程调用ReleaseMutex(),将mu tex 释放掉。于是循环回到第一场景,周而复始。

处理被舍弃的互斥器(Mutexes)


文字版电子书-----请点击这里

linux和win32下通用的互斥锁Mutex封装 linux和win32下通用的互斥锁Mutex封装,统一接口,可直接使用 立即下载

相关推荐

Win32多线程程序设计 英文版

Win32多线程程序设计 英文版

Win32多线程之互斥器(Mutexes)

Win32的Mutex用途和critical section非常类似,但是它牺牲速度以增加弹性,或许你已经猜到了。mutex 是MUTual EXclusion的缩写。一个时间内只能够有一个线程拥有mutex,就好像同一时间内只能够有一个线程进入同一个critical section一样。   虽然mutex和critical section做同样的事情,但是它们的运作还是有差别的:   1)

wjj715211的专栏 1494

从时序博弈到数据稳定:CS1237驱动中的信号滤波与卡尔曼实践

本文探讨了CS1237高精度ADC驱动在复杂工业环境中的信号处理挑战,重点介绍了一阶滤波与自适应卡尔曼滤波算法的实践应用。通过参数优化和动态调整策略,有效提升了数据稳定性和抗干扰能力,为嵌入式系统在噪声环境下的精密测量提供了可靠解决方案。

rnn9storyteller的博客 865

Win32多线程 -- 线程同步之互斥器(Mutex)

CRITICAL_SECTION Mutex InitializeCriticalSection() CreateMutex() OpenMutex() EnterCriticalSection() WaitForSingleObject() WaitForMultipleObjects() MsgWaitForMultipleObjects() LeaveCriticalSection() ReleaseMutex() DeleteCriticalSec

cfz751740465的博客 734

CentOS7 编译升级GCC至9.3.0

1)下载GCC9.2.0源码并解压 从GCC官方FTP下载地址可以看到GCC最新版本为9.3.0。由于官网下载速度慢,实际上用清华大学的镜像站进行下载,代码如下: wget -c /opt/tmp/ https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-9.3.0/gcc-9.3.0.tar.gz #考虑到安装失败的可能性,创建一个临时文件夹来安装GCC...

haha123486的博客 1万+

KUKA 虚拟调试实战——打通Simpro4.1与OfficeLite8.6的通信与实时控制链路

本文详细介绍了KUKA虚拟调试实战,重点解析如何打通Simpro4.1与OfficeLite8.6的通信与实时控制链路。通过环境搭建、权限配置、机器人型号匹配等关键步骤,帮助工程师高效完成机器人轨迹规划和PLC联锁逻辑验证,大幅降低真机调试风险。文章还提供了典型报错解决方案和实时控制优化技巧,适用于工业机器人仿真与培训场景。

weixin_30907935的博客 451

WIN32核心编程 - 线程操作(二) 同步互斥

自动重置事件(Auto Reset Event):当事件被一个等待的线程接收(signaled)后,系统会自动将事件状态重置为非信号状态(non-signaled)。同一时刻下只有一个线程可以拥有互斥体的所有权,如果一个线程拥有了互斥体的所有权,则其他请求该互斥体的线程将会被阻塞,直到互斥体权限释放。如果信号量的值为0,则线程阻塞,直到信号量的值变为大于0。在Windows编程中,事件是一种同步机制,用于在多个线程之间发送信号。共享资源的线程同步机制,临界区在同一进程的线程之间提供了互斥访问。

0xCC说逆向 1426

别再瞎调了!手把手教你搞定STM32步进电机PID速度环(附完整代码与比例系数详解)

本文详细解析了STM32步进电机PID速度环的完整实现过程,从算法输出到脉冲频率的转换链路,重点讲解了比例系数的确定方法及系统标定实验。通过完整的代码示例和调试技巧,帮助工程师解决实际应用中的常见问题,提升步进电机控制精度与稳定性。

weixin_28729331的博客 214

用C++实现多线程Mutex锁(Win32)

本文目的:用C++和Windows的互斥对象(Mutex)来实现线程同步锁。     准备知识:1,内核对象互斥体(Mutex)的工作机理,WaitForSingleObject函数的用法,这些可以从MSDN获取详情; 2,当两个或更多线程需要同时访问一个共享资源时,系统需要使用同步机制来确保一次只有一个线程使用该资源。Mutex 是同步基元,它只向一个线程授予对共享资源的独占访问权。如果一个线

Bruce Che 的专栏 3万+

YOLOv8独家原创改进:SPPF原创自研创新 | SPPF创新结构,重新设计全局平均池化层和全局最大池化层,增强全局视角信息和不同尺度大小的特征

SPPF_improve利用全局平均池化层和全局最大池化层,加入一些全局背景信息和边缘信息,从而获取全局视角信息并减轻不同尺度大小所带来的影响

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 4684

labelImg使用教程

Anaconda环境 安装 Anaconda 之后,在开始菜单下找到 Anaconda 文件夹 找到 Anaconda Prompt 点击运行 安装 labelImg pip install labelImg #直接命令行输入 启动 labelImg labelImg #直接命令行输入名称即可 labelImg界面 开始标注 快捷键:W(创建方框),A(上一张),D(下一张) XML文件示例 <annotation> <folder>夜读</folder>

G果的博客 3万+

Win32 多线程程序设计有关的函数说明

Win32 多线程

weixin_45144862的博客 1192

ITKMontage---ITK自动拼接模块

本文分享ITK中Remote中的ITKMontage拼接模块,希望对各位小伙伴有所帮助!1. ITKMontage介绍在医疗图像处理过程中,图像拼接有很多用处,比如DR图像的拼接。ITKMontage可以快速稳定的处理数据量较大的拼接图像。强度不均匀性校正配准全局优化融合2. ITKMontage安装ITKMontageITKMontage可脱离ITK进行单独安装,也可在ITK安装时作为模块进行安装。单独安装ITK模块安装在ITK编译时,选择ITKMontage模块。

qq_40041064的博客 450

WIN32多线程程序设计学习笔记

WIN32多线程程序设计学习笔记(第二章)  《WIN32多线程程序设计》这本书也看了好多遍,但总是觉得印象不深;我想是不是应该做做笔记,一来可以加深一下印象。二也在可以在用时方便查阅。J 首先,我觉得线程一点都不难(这样的心理暗示会使我觉得学的轻松一些);why?  与调用函数的过程类似;线程只不过用CreateThread的API将函数 HANDLE hThread

code09的专栏 1226

RHCA II之路---EX442-10

这题比较耗时,可以多开2个窗口让他跑起来后先做后面的题目。

Q先生 589

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

WIN32多线程程序设计学习笔记(第四章 上)

<br />WIN32多线程程序设计学习笔记(第四章 上) 收藏 <br />  <br />WIN32多线程程序设计学习笔记(第四章 上)<br /> <br />到目前为止,我已经知道如何创建线程,销毁线程及如何判断一个线程是否结束了;但运用线程,管理线程,如何使线程按自己意愿正确运行才是多线程程序设计的重点及难点。<br /> <br />大家知道,线程具有并发性,在同一时间段会存在多个线程,当这些线程同时存取同一数据时,就会有问题。就像在超市储物品一样,来的时候物品箱是空,转身拿物品准备储的时候,发

looob的专栏 509

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

WIN32多线程程序设计学习笔记[转]

2007-1-27 18:17:00   500){this.resized=true;this.style.width=500;}" alt="" /> 《WIN32多线程程序设计》这本书也看了好多遍,但总是觉得

2079 1692

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

OV9734 DATASHEET,完整规格书

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

win32多线程程序设计笔记(第四章上)

前面已经介绍了线程的创建、销毁过程,如何判断一个线程是否结束;但是撰写多线程程序的一个挑战性问题就是:如何让一个线程和另外一个线程合作。         在同一时间段会存在多个线程,当这些线程同时存取同一数据时,就会有问题。就像在超市储物品一样,来的时候物品箱是空,转身拿物品准备储的时候,发现物品箱已被占用了。这时,物品箱就是我所说的同一数据,人指的就是线程了。         线程之间的

海阔天空的专栏 1235

第4章 同步控制 Synchronization ----互斥器(Mutexes)

Win32 的 Mutex 用途和 critical section 非常类似,但是它牺牲速度以增加弹性。或许你已经猜到了,mutex 是 MUTual EXclusion 的缩写。一个时间内只能够有一个线程拥有 mutex,就好像同一时间内只能够有一个线程进入同一个 critical section 一样。虽然 mutex 和 critical section 做相同的事情,但是它们的运作还是有...

weixin_30635053的博客 213

win32多线程(三) 死锁

任何时候当一段代码需要两个(或更多)资源时,都有潜在性的死锁。 void SwapLists(List *list1, List *list2) { List *tmp_list; EnterCriticalSection(list1->m_section); EnterCriticalSection(list2->m_section); tmp->li...

weixin_30666943的博客 136
上一篇: 《Win32多线程程序设计》(3)---同步控制
下一篇: 《Win32多线程程序设计》(5)---信号量(Semaphores)
一零一六
博客等级 码龄14年 1粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值