阅读:1857回复:8
为啥不能使用event等同步对象替代自旋锁?
为啥不能使用event等同步对象替代自旋锁?
|
|
沙发#
发布于:2007-05-16 09:10
理论上可以,不过自旋锁是轻量级的,记得自旋锁是多cpu安全的
|
|
|
板凳#
发布于:2007-05-16 09:34
而且自旋锁会提升到dispatch_level,而其他同步的不是
|
|
|
地板#
发布于:2007-05-16 11:43
SpinLock用于多个CPU同步,如果不成功,线程不会睡眠,而会持续的尝试,这就是“自旋”的真实含义了。也由此可见,使用自旋锁必需注意,一定要最小化持锁时间。
简单调用KeInitializeSpinLock初始化自旋锁后,SpinLock就可以使用了。调用KeAcquireSpinLock可以将当前IRQL提高到DISPATCH_LEVEL,直到用对应的KeRelaeseSpinLock调用将此IRQL恢复到改变前的值为止。KeAcquireSpinLockAtDpcLevel和KeRelaeseSpinLockFromDpcLevel的调用在运行速度方面要更快一些,因为它们已经运行在DISPATCH_LEVEL上。 此外,DDK还提供了诸如InterlockedXxx的一系列函数,比如InterlockedExchange等等,方便易用。实际上都用到了自旋锁。 还有IoCancelIrp等等也用到了自旋锁。 |
|
|
地下室#
发布于:2007-05-16 16:21
建议驱动层中用SpinLock,Mutex,驱动层和应用层通信时考虑Event.
|
|
5楼#
发布于:2007-05-16 16:36
引用第3楼driverdance于2007-05-16 11:43发表的 : 解释的相当全面啊 |
|
|
6楼#
发布于:2007-05-17 14:55
SPINLOCK 主要是针对 SMP 系统,在单 CPU 上使用和 KeRaiseIrql(DISPATCH_LEVEL)
没区别。SMP 上才会 lock BUS。 |
|
7楼#
发布于:2007-05-18 11:38
引用第3楼driverdance于2007-05-16 11:43发表的 : 兄弟 .... 操作SpinLock的核心例程和InterlockedXxx的一系列例程不一样,出了lock前缀指令 ,,,还有微妙的实质的差异..... 呵呵....... |
|
驱动小牛
![]() |
8楼#
发布于:2007-05-18 15:48
WDM关于同步那章,详细讲述了各种同步机制的差别.
|
|