windows内核态线程同步

本文介绍了Windows内核态线程同步的重要性,详细讨论了等待函数、事件、可等待计时器、信号量和互斥量等内核对象在同步中的作用。通过实例分析了各种同步机制的特点和使用场景,包括手动重置事件和自动重置事件的区别,以及计时器、信号量和互斥量的资源管理规则。
摘要由CSDN通过智能技术生成

内核态线程同步

以下内容引述《windows核心编程》

为什么用内核态同步

在用户态下进行线程同步的最大好处就是速度非常快,但是也存在一些局限性,而且不适用于许多应用程序。
例如,对interlockd系列函数只能对一个值进行操作,他们从来不会把线程切换到等待状态;
使用关键段把线程切换到等待状态,但是他们只能用来对同一个进程中的线程进行同步;
在使用关键段的时候我们容易陷入死锁,因为无法为进入关键段指定一个最长等待时间。

内核态同步

内核对象唯一个缺点就是性能。几乎所有的内核对象都可以用来进行同步。对线程同步来说,内核对象要不处于触发状态,要么处于未触发状态。
进程内核对象的内部有一个布尔变量,当系统创建内核对象的时候会把这个变量的值初始化为FALSE(未触发)。当线程终止的时候,操作系统会自动把相应的内核对象中的这个布尔值设为FALSE,表示该对象已经被触发。
以下内核对象既可以处于触发状态,也可以处于未触发状态:

  • 进程
  • 线程
  • 作业
  • 文件以及控制台的标准输入流/输出流/错误流
  • 事件
  • 可等待的计时器
  • 信号量
  • 互斥量

windows下提供进行线程同步的内核对象:事件、可等待计时器、信号量以及互斥量。
当线程正在等待的对象处于未触发状态时,它们是不可调度的;但是,一旦对象被触发,那么线程就会看到这面旗帜,从而变成可调度状态,然后很快会继续执行。

等待函数

等待函数使线程自愿进入等待状态,直到指定的内核对象被触发为止。如果线程在调用一个等待函数的时候,相应的内核对象已经处于触发状态,那么线程是不会进入等待状态的。

DWORD WaitForSingleObject(HANDLE hObject, DWORD dwMilliseconds);

参数一 HANDLE是用于识别内核对象的;
参数二 dwMilliseconds用于设置指定线程愿意花多久的时间来等待对象被触发。
返回值表示为什么调用线程又能够继续执行了。如果是因为线程等待的对象被触发,那么返回值是WAIT_OBJECT_0;如果是因为等待超时,那么返回值是WAIT_TIMEOUT。如果传入的内核句柄是无效参数,返回值是WAIT_FAILED
本函数不会浪费宝贵的CPU时间。

DWORD WaitForMultipleObjects(
	DWORD dwCount,
	CONST HANDLE* phObjects,
	BOOL bWaitAll,
	DWORD dwMilliseconds);

dwCount值必须在1~MAXMUM_WAIT_OBJECTS(64)之间。
如果bWaitAll传入FALSE,那么只要任何一个对象被触发,函数就会立即返回,返回值是WAIT_OBJECT_0和(WAIT_OBJECT_0+dwCount-1)之间的任何一个值;如果bWaitAll传入TRUE,而且所有对象都被触发了,那么返回值是WAIT_OBJECT_0

等待成功副作用

当事件对象被触发的时候,函数会检测到这一情况,这时它可以直接返回WAIT_OBJECT_0给调用线程。但是在函数返回之前,它会使事件变为非触发状态。

HANDLE h[2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值