GuoJuan78
驱动牛犊
驱动牛犊
  • 注册日期2005-01-03
  • 最后登录2010-05-17
  • 粉丝0
  • 关注0
  • 积分423分
  • 威望43点
  • 贡献值0点
  • 好评度42点
  • 原创分0分
  • 专家分0分
阅读:1857回复:8

为啥不能使用event等同步对象替代自旋锁?

楼主#
更多 发布于:2007-05-15 21:07
为啥不能使用event等同步对象替代自旋锁?
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
沙发#
发布于:2007-05-16 09:10
理论上可以,不过自旋锁是轻量级的,记得自旋锁是多cpu安全的
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
fanzi
驱动小牛
驱动小牛
  • 注册日期2004-12-09
  • 最后登录2013-12-19
  • 粉丝1
  • 关注0
  • 积分1004分
  • 威望754点
  • 贡献值0点
  • 好评度93点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-05-16 09:34
而且自旋锁会提升到dispatch_level,而其他同步的不是
张帆的内核学习论坛 http://bbs.kerneldev.com
driverdance
驱动牛犊
驱动牛犊
  • 注册日期2007-04-18
  • 最后登录2007-08-13
  • 粉丝0
  • 关注0
  • 积分640分
  • 威望65点
  • 贡献值0点
  • 好评度64点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-05-16 11:43
SpinLock用于多个CPU同步,如果不成功,线程不会睡眠,而会持续的尝试,这就是“自旋”的真实含义了。也由此可见,使用自旋锁必需注意,一定要最小化持锁时间。

简单调用KeInitializeSpinLock初始化自旋锁后,SpinLock就可以使用了。调用KeAcquireSpinLock可以将当前IRQL提高到DISPATCH_LEVEL,直到用对应的KeRelaeseSpinLock调用将此IRQL恢复到改变前的值为止。KeAcquireSpinLockAtDpcLevel和KeRelaeseSpinLockFromDpcLevel的调用在运行速度方面要更快一些,因为它们已经运行在DISPATCH_LEVEL上。
此外,DDK还提供了诸如InterlockedXxx的一系列函数,比如InterlockedExchange等等,方便易用。实际上都用到了自旋锁。
还有IoCancelIrp等等也用到了自旋锁。
承接WDM和hook的项目。
zh002008
驱动牛犊
驱动牛犊
  • 注册日期2004-08-22
  • 最后登录2013-09-06
  • 粉丝1
  • 关注1
  • 积分545分
  • 威望155点
  • 贡献值0点
  • 好评度51点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-05-16 16:21
建议驱动层中用SpinLock,Mutex,驱动层和应用层通信时考虑Event.
fanzi
驱动小牛
驱动小牛
  • 注册日期2004-12-09
  • 最后登录2013-12-19
  • 粉丝1
  • 关注0
  • 积分1004分
  • 威望754点
  • 贡献值0点
  • 好评度93点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-05-16 16:36
引用第3楼driverdance于2007-05-16 11:43发表的  :
SpinLock用于多个CPU同步,如果不成功,线程不会睡眠,而会持续的尝试,这就是“自旋”的真实含义了。也由此可见,使用自旋锁必需注意,一定要最小化持锁时间。

简单调用KeInitializeSpinLock初始化自旋锁后,SpinLock就可以使用了。调用KeAcquireSpinLock可以将当前IRQL提高到DISPATCH_LEVEL,直到用对应的KeRelaeseSpinLock调用将此IRQL恢复到改变前的值为止。KeAcquireSpinLockAtDpcLevel和KeRelaeseSpinLockFromDpcLevel的调用在运行速度方面要更快一些,因为它们已经运行在DISPATCH_LEVEL上。
此外,DDK还提供了诸如InterlockedXxx的一系列函数,比如InterlockedExchange等等,方便易用。实际上都用到了自旋锁。
还有IoCancelIrp等等也用到了自旋锁。

解释的相当全面啊
张帆的内核学习论坛 http://bbs.kerneldev.com
sinister
驱动牛犊
驱动牛犊
  • 注册日期2005-03-02
  • 最后登录2013-01-24
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望38点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分1分
6楼#
发布于:2007-05-17 14:55
SPINLOCK 主要是针对 SMP 系统,在单 CPU 上使用和 KeRaiseIrql(DISPATCH_LEVEL)
没区别。SMP 上才会 lock BUS。
qiweixue
驱动小牛
驱动小牛
  • 注册日期2004-07-21
  • 最后登录2011-12-19
  • 粉丝0
  • 关注0
  • 积分1006分
  • 威望274点
  • 贡献值0点
  • 好评度268点
  • 原创分1分
  • 专家分0分
7楼#
发布于:2007-05-18 11:38
引用第3楼driverdance于2007-05-16 11:43发表的  :
SpinLock用于多个CPU同步,如果不成功,线程不会睡眠,而会持续的尝试,这就是“自旋”的真实含义了。也由此可见,使用自旋锁必需注意,一定要最小化持锁时间。

简单调用KeInitializeSpinLock初始化自旋锁后,SpinLock就可以使用了。调用KeAcquireSpinLock可以将当前IRQL提高到DISPATCH_LEVEL,直到用对应的KeRelaeseSpinLock调用将此IRQL恢复到改变前的值为止。KeAcquireSpinLockAtDpcLevel和KeRelaeseSpinLockFromDpcLevel的调用在运行速度方面要更快一些,因为它们已经运行在DISPATCH_LEVEL上。
此外,DDK还提供了诸如InterlockedXxx的一系列函数,比如InterlockedExchange等等,方便易用。实际上都用到了自旋锁。
还有IoCancelIrp等等也用到了自旋锁。



兄弟 ....


操作SpinLock的核心例程和InterlockedXxx的一系列例程不一样,出了lock前缀指令
,,,还有微妙的实质的差异.....

呵呵.......
yandong_8212
驱动小牛
驱动小牛
  • 注册日期2006-07-28
  • 最后登录2011-02-11
  • 粉丝0
  • 关注0
  • 积分1046分
  • 威望464点
  • 贡献值1点
  • 好评度173点
  • 原创分0分
  • 专家分1分
8楼#
发布于:2007-05-18 15:48
WDM关于同步那章,详细讲述了各种同步机制的差别.
商务MSN:YanDong_8212@163.com
游客

返回顶部