线程同步之Win32API的Wait函数

Win32线程API在多核编程中的实战技巧与优化 多线程编程是现代软件开发的核心技术,尤其在多核处理器架构下,合理利用并行计算能力能显著提升程序性能。Win32线程API作为Windows平台的底层线程控制接口,提供了线程创建、同步原语和性能调优等关键功能。从技术原理看,线程同步通过临界区、互斥量等机制解决资源竞争问题,而线程亲和性等优化技术则能减少上下文切换开销。在实时系统、高性能计算等场景中,合理使用WaitForMultipleObjects等API能实现精细的线程调度控制。通过结合Interlocked原子操作和无锁编程技术,开发者可以在保证线程安 阅读详情
线程同步之Win32API的Wait函数

Win32API中的Wait函数非常重要,很多同步都需要Wait函数的配合,Wait函数很多,常用的我就不赘述了,只对一些有用但不常用的函数做一些描述。

1.WaitForSingleObject

最常用的函数,不用多说了。对于信号灯和信号量,每用一次,信号量减一。

DWORD WaitForSingleObject(
  HANDLE hHandle,        // handle to object
  DWORD dwMilliseconds   // time-out interval
);
2.WaitForSingleObjectEx
DWORD WaitForSingleObjectEx(
  HANDLE hHandle,        // handle to object
  DWORD dwMilliseconds,  // time-out interval
  BOOL bAlertable        // alertable option
);
基本上和WaitForSingleObject一致,所不同的在于WaitForSingleObjectEx = 
WaitForSingleObject(,,FALSE),也就是说在参数为TRUE的情况下可以进入线程告警状态,
可以使用APC机制。
3.WaitForMultipleObjects
DWORD WaitForMultipleObjects(
  DWORD nCount,             // number of handles in array
  CONST HANDLE *lpHandles,  // object-handle array
  BOOL fWaitAll,            // wait option
  DWORD dwMilliseconds      // time-out interval
);
和WaitForSingleObject不同之处,在于等待多个句柄,这应该是一个与的关系,即是所有的句柄
都需要处于发信号的状态。
4.WaitForMultipleObjectsEx
DWORD WaitForMultipleObjectsEx(
  DWORD nCount,             // number of handles in array
  CONST HANDLE *lpHandles,  // object-handle array
  BOOL fWaitAll,            // wait option
  DWORD dwMilliseconds,     // time-out interval
  BOOL bAlertable           // alertable option
);
这个不需要多说什么了。
Note:现在介绍几种返回值
WAIT_OBJECT_0:状态处于发信号的状态。最合理的结束方式。
WAIT_TIMEOUT:超时退出。
WAIT_ABANDONED:针对Mutex对象,就是在owner线程退出之前也没有释放Mutex。
WAIT_FAILED:出错退出。需要使用GetLastErr.
下面的可以能有绕:
WAIT_OBJECT_0 to (WAIT_OBJECT_0 + nCount – 1):
如果fWaitAll是TRUE,返回WAIT_OBJECT_0表示所有句柄都发了信号;
如果fWaitAll是FLASE,返回什么就是第几个句柄发了信号。
WAIT_ABANDONED_0 to (WAIT_ABANDONED_0 + nCount – 1):
如果fWaitAll是TRUE,返回值WAIT_ABANDONED_0表示所有的线程发信号,至少一个线程退出;
如果fWaitAll是TRUE,至少一个线程退出,句柄就是返回值指的那个。
接着我们来看下面两个函数,一起说了:
DWORD MsgWaitForMultipleObjects(
  DWORD nCount,          // number of handles in array
  CONST HANDLE pHandles, // object-handle array
  BOOL fWaitAll,         // wait option
  DWORD dwMilliseconds,  // time-out interval
  DWORD dwWakeMask       // input-event type
);
DWORD MsgWaitForMultipleObjectsEx(
  DWORD nCount,          // number of handles in array
  CONST HANDLE pHandles, // object-handle array
  DWORD dwMilliseconds,  // time-out interval
  DWORD dwWakeMask,      // input-event type
  DWORD dwFlags          // wait options
);
我感觉这和WaitForMultipleObjects最大的区别在于,前者可以继续转消息泵,
而后者能把消息泵都停掉了,所以肯定收不到消息了。
特别提醒,fWaitAll,只能设置成FALSE,谨慎啊。
DWORD SignalObjectAndWait(
  HANDLE hObjectToSignal,  // handle to object to signal
  HANDLE hObjectToWaitOn,  // handle to object to watch
  DWORD dwMilliseconds,    // time-out interval
  BOOL bAlertable          // alertable option
);
向一个句柄发一个信号,接着等待另一个句柄,用起来很简单,应该可用性很强。
最后说四个函数
BOOL RegisterWaitForSingleObject( 
  PHANDLE phNewWaitObject,       // wait handle
  HANDLE hObject,                // handle to object
  WAITORTIMERCALLBACK Callback,  // timer callback function
  PVOID Context                  // callback function parameter
  ULONG dwMilliseconds,          // time-out interval
  ULONG dwFlags                  // options
); 
这个函数测试了很久,才稍微有点一点心得。首先,Event一定要设定成自动的,
我因为这个问题吃尽苦头,然后可以当一个线程池来用,但是还有一个问题,
如下:
BOOL UnregisterWait(
  HANDLE WaitHandle      // wait handle
);
BOOL UnregisterWaitEx(
  HANDLE WaitHandle,      // wait handle
  HANDLE CompletionEvent  // completion event
);
这个函数在使用的时候需要保护句柄,呵呵,否则系统很生气,后果很严重:)
建议使用INVALID_HANDLE_VALUE作为第二个参数,它会等到任务结束后,才注销。
VOID CALLBACK WaitOrTimerCallback(
  PVOID lpParameter,        // thread data
  BOOLEAN TimerOrWaitFired  // reason
);
回调函数无需赘述。
 
Oracle数据库安装及配置(Oracle19c) Windows 10安装Oracle 19c教程 阅读详情

相关推荐

SPI 协议帧格式深度解析:从 8 位数据到 16 位扩展的 3 种模式

本文深入解析SPI协议的帧格式,涵盖从8位标准到16位扩展的三种模式。通过详细讲解SPI时钟模式、数据宽度配置及实际应用案例,帮助开发者掌握SPI外设的深度定制能力,提升嵌入式系统开发效率。特别适用于连接传感器、存储器和显示器等高速通讯场景。

weixin_34110749的博客 345

WaitForSingleObjectEx超时参数说明

WaitForSingleObjectEx函数原型如下 DWORD WINAPI WaitForSingleObjectEx( __in HANDLE hHandle, __in DWORD dwMilliseconds, __in BOOL bAlertable ); 在SDK6.1文档中,对参数dwMilliseconds说明如下: The time

xbgprogrammer的专栏 1万+

硬件测试入门--环路响应(Bode)测试

环路分析的一个重要作用就是分析开关电源的稳定性。扫频测试原理主要是给开关电源电路注入一个频率变化的正弦信号,测量开关电源在频域上的特性,通过分析穿越频率、增益裕度和相位裕度来判断环路是否稳定,可以为电子工程师设计稳定的控制电路提供直观的数据。开关电源的稳定性关系到整个应用系统的可靠性,利用伯德图可以看出在不同频率下系统增益的大小和相位。通过伯德图来对开关电源的环路稳定性进行判断和分析已经成为评估开关电源可靠性必不可少的方法。

songninging的博客 1万+

多线程锁详解之【WaitForSingleObject】

WaitForSingleObject

qq492927689的博客 4772

Qt制作大数据可视化大屏展示电子看板

Qt制作大数据可视化大屏展示电子看板 解决当前最火的大数据可视化大屏展示,整个项目通过Qt开发,集成了QML/QChart/ECharts及自定义控件等模块,所有的可视化控件都可以集成到其中。可以随意增加和减少模块,各个模块可以随意拖拽,整体可以个性化布局。模块标题栏可自定义,包括标题文本信息、文本颜色、宽度/高度、背景颜色、按钮个数等功能,满足各个样式需求。 实例中主要展示了现成的一些仪表盘...

Qt自定义控件及应用开发 7707

OpenTCS打造移动机器人交通管制系统(四)

先分析下OpenTCS的一些策略方面的东西,这是OpenTCS的基础。 首先需要先明确下OpenTCS内核中的三个概念: 路由(Route) : 决定了车辆通过什么样的方式和算法来获得一段路径,未来车辆将沿着此路径运行。 派遣(Dispacher): 决定了一个订单应该关联哪一辆小车,即为订单分配车辆和为车辆分配订单。 调度(schedule):狭义上的调度,交通管制的核心,决定了何时分配...

白色冰激凌的技术专栏 5272

WaitForSingleObject

来自MSDN 作用: 一直等待到所指定的对象生命周期终止或者超时时间到达。 若要进入一个能够提出警告的等待状态,则使用WaitForSingleObjectEx函数。等待多个对象,使用WaitForMultipleObjects函数。 语法: C++ DWORD WINAPI WaitForSingleObject{ _In_ HANDLE hHandle, _In_ DWORD

x-2010的笔记 4060

OpenCV图像拼接实战:用SIFT+透视变换打造无缝全景图(附完整代码)

本文详细介绍了使用OpenCV和SIFT算法实现图像拼接的全过程,包括特征匹配、透视变换和高级融合技术。通过实战代码演示,帮助开发者掌握无缝全景图生成的核心技术,适用于旅行摄影、无人机航拍等多种场景。

eee77的博客 998

APC机制两个问题

一、特定情况下WaitForSingleObjectEx返回值的问题 等待内核对象处于激活状态 (下面是hEvent) 线程处于警觉状态,且APC队列中有函数(APCProc) 两个条件同时满足的时候,WaitForSingleObjectEx这个函数的返回值是什么? 代码: #include <stdio.h> #include <windows.h> VOID ...

z4ky的博客 528

奇异值分解(SVD)C++实现

奇异值分解SVD(紧奇异值分解,截断奇异值分解)C++实现

weixin_45804601的博客 4172

YOLOv11模型改进-模块-引入空间池化模块StripPooling 解决遮挡、小目标

本文介绍了一种新的空间池化策略,称为,用于场景解析。结构:包括两个平行路径,分别进行水平和垂直方向的条带池化,然后通过1D卷积层进行特征调整。:结合了条带池化和传统的空间池化,分别用于捕捉长距离和短距离的依赖关系。作用捕捉长距离依赖:通过长条形的池化窗口,有效捕捉分布离散的区域之间的关系。避免不相关信息干扰:窄条形的池化窗口有助于捕捉局部上下文,防止不相关区域干扰标签预测。提高场景解析性能:在多个基准数据集上,证明了这种方法能够显著提升场景解析的效果。

qq_64693987的博客 4205

《Windows核心编程系列》十谈谈同步设备IO与异步设备IO之异步IO

http://blog.youkuaiyun.com/ithzhang/article/details/8316171 同步设备IO与异步设备IO之异步IO介绍 设备IO与cpu速度甚至是内存访问相比较都是比较慢的,而且更不可预测。虽然如此,通过使用异步设备IO我们仍然能够创造出更高效的程序。 同步IO时,发出IO请求的线程会被挂起。而异步IO时发出请求的线程不会被...

系统运维 249

RandLA-Net Tensorrt 推理 c++

RandLA-Net 实现 Tensorrt 部署.

J。 1110

使用Win32 API实现生产者消费者线程同步

#include #include #define QUEUE_LENGTH 10 //缓冲区长度 HANDLE full_sem; //满信号量 HANDLE empty_sem; //空信号量 struct Msg { int i; };//消息结构 Msg MsgQueue[QUEUE_LENGTH]; //缓冲区 int head = 0;//队列头 int tail =

giantpoplar的专栏 3408

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

c++ win32API 【CreateThread】创建线程

前言: 最近项目使用vs2010 还没有 std::thread 到 vs2013 才有集成的 std::thread 吧 用了一下 win32API 创建了一个简单的线程 这里简单写个demo 介绍一下 也当做一个笔记 下面的不管 我没有调用 这个就是他的参数 咱们挨个介绍一下 第一个参数是安全属性,一般设为null,使用缺省的安全属性。当我们想此线程有另外的子进程时,可改变它的属性。 第二个参数是线程堆栈尺寸,一般设为0,表示与此应用的堆栈尺寸相同,即主线程与创建的线程一样长度的堆栈。并且其长度会

shenmingyi.blog.youkuaiyun.com 1734

Win32和c++11多线程

如果这样加锁,那么只要有一个线程进入临界区,除非所有票卖完,否则不会释放临界区。如果这样加锁,又会出现卖出第0张票的情况。最后这种情况,修改代码,在进入临界区后再次判断,可以避免上述情况。

qq_24867003的博客 1568

【Win32 多线程同步机制的区别】

Win32同步机制主要包括临界区、互斥器、信号量、事件对象和互锁变量,它们在核心对象属性、跨进程能力、性能、超时控制、拥有权规则等方面存在显著差异。临界区最快但仅限进程内使用,互锁变量依赖硬件原子操作,互斥器支持跨进程和线程遗弃检测,信号量适合资源共享,事件对象则用于线程间通知。不同机制各有适用场景,选择时需权衡速度、功能和安全性。

云小逸的博客 1039

用C++实现Win32事件对象,同步线程

在Win32环境下编写多线程应用程序,经常要用到事件对象Event,来进行线程同步。与其相关的一组API包括:CreateEvent,SetEvent,ResetEvent,WaitForSingleObject,和CloseHandle。关于这些API的功能以及参数意义等这里就不多说了。下边,我封装了一个事件对象类,以及测试代码。已由本人在VS2005环境下编译,测试通过。 MyEvent.h

Bruce Che 的专栏 5138

WIN32多线程二 用WaitXXX函数等待线程结束

等待线程结束的更好方法是调用API WaitForSigleObject和WaitForMultipleObjects。前者用于等待一个线程由未激发状态变为激发状态,后者用于等待多个线程中全部或多个中的一个由未激发状态变为激发状态。对线程内核对象而言,如果线程在运行,则是未激发状态;如果线程已经退出,则是激发状态。不同内核对象的激发、未激发状态含义有所不同。DWORD WINAPI WaitFor...

测试 426

win32多线程的相关函数使用总结

/**************************请看代码实例*************************************************/ #include #include using namespace std; DWORD WINAPI ThreadProc(LPVOID lpParameter) {  cout  int n=(int)lpPar

woshizfs(软件开发)的专栏 1338

《Win32多线程程序设计》之线程同步

线程等待 等待是线程的必要之恶。 比较low的等待方法是:1.sleep(), 2.循环GetExitCodeThread()。这两种方法耗cpu,且使代码效率低下。用WaitForSingleObject,等待核心对象变为激发状态DWORD WaitForSingleObject( HANDLE hHandle, DWORD dwMilliseconds );DWORD WaitForMult

qingmoshu的专栏 457

C++多线程编程:同步之事件Event

文章目录1. CreateEvent()2. SetEvent3. WaitForSingleobject()4. CloseHandle()5. 示例演示6. 利用Event事件对象实现一个程序只允许运行一个进程 事件(Event)是WIN32提供的最灵活的线程可同步方式,根据状态变迁方式的不同,事件可分为两类 手动设置:这种对象只可能用程序手动设置在需要该事件或者事件发生时,采用 SetEvent及ResetEvent来进行设置。 自动恢复:一旦事件发生并被处理后,自动恢复到没有事件状态,不需要再次设置

超级大洋葱的博客 2400

用c++实现win32事件对象,同步线程

在Win32环境下编写多线程应用程序,经常要用到事件对象Event,来进行线程同步。与其相关的一组API包括:CreateEvent,SetEvent,ResetEvent,WaitForSingleObject,和CloseHandle。关于这些API的功能以及参数意义等这里就不多说了。下边,我封装了一个事件对象类,以及测试代码

Tears的专栏 765

【转】Win32下两种用于C++的线程同步类(下)

Win32 c++ 线程同步 上一篇中我介绍了一种通过封闭Critical Section对象而方便的使用互斥锁的方式,文中所有的例子是两个线程对同一数据一读一写,因此需要让它们在这里互斥,不能同时访问。而在实际情况中可能会有更复杂的情况出现,就是多个线程访问同一数据,一部分是读,一部分是写。我们知道只有读-写或写-写同时进行时可能会出现问题,而读-读则可以同时进行,...

dengtaojiu7237的博客 104
上一篇: 理解I/O Completion Port
下一篇: MS-VC 使用MAP文件快速定位程序崩溃代码行
amdk_7
博客等级 码龄22年 12粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值