在<<Windows网络与通信程序设计>>有一段话讲spin lock:在相同处理器上,运行在更高IRQL的线程虽然可以强占执行的线程,但是这些现成并不能获取旋转锁,因为旋转锁的IRQL比他们的还低.请大牛解释下这段话吧,为什么旋转锁的IRQL比他们的还低,其他更高IRQL的线程反而不能获取旋转锁?
解决方案 »
- 求助 我定义一个泛型模板类,里面有个静态函数,为什么调用报错(compiler file 'msc1.cpp', line 1786)
- 在用VS2008调试一程序时出现错误:DataSet.exe 中的 0x0045df1c 处最可能的异常: 0xC0000005: 读取位置 0xcdcdce2
- vs2005优化带来的问题,不知是否vs2005的Bug
- 那位有wav转成mp3的demo给我发一份呀,高分!
- 高手指教怎么才能作出这样的效果
- 用MFC开发的ocx控件中的edit编辑框,不能响应左右方向键问题?
- 弱弱的问,在dialog上画图该在什么地方写代码?
- 为什么不能换行
- 请指点
- 利率 问题
- VC 按钮控件时而消失,时而出现
- 初学 请教,简单问题
#if defined(_X86_)#define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
#define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)#else//
// These functions are imported for IA64, ntddk, ntifs, nthal, ntosp, and wdm.
// They can be inlined for the system on AMD64.
//#define KeAcquireSpinLock(SpinLock, OldIrql) \
*(OldIrql) = KeAcquireSpinLockRaiseToDpc(SpinLock)你的,明白?KfAcquireSpinLock,KeAcquireSpinLockAtDpcLevel除了不提升IRQL到DISPATCH_LEVEL,其他是一样的效果。都能得到锁MSDN上有这样一段文字:
当IRQL= DISPATCH_LEVEL时,驱动调用KeAcquireSpinLockAtDpcLevel比调用KeAcquireSpinLock 有更好的性能。当IRQL<DISPATCH_LEVEL时,驱动必须调用KeAcquireSpinLock。
谢谢大牛对自旋锁清晰的描述.那本书上好象在暗示 "自旋锁自身也有对应的IRQL"?把我搞晕头了...不是只有线程才会有IRQL么?况且线程得到自旋锁后自身的IRQL提升到DISPATCH_LEVEL后肯定不会被其他的线程切换.难道是拥有自旋锁线程的IRQL变了则它拥有的自旋锁的IRQL反而是最低的的吗?
旋转锁的获取使得线城的IRQL临时的提升到了与旋转锁相关的级别.这阻止了相同的处理器上所有更低IRQL的线程强占执行的线程.在相同处理器上,运行在更高的线程虽然可以强占执行的线程,但是这些现成并不能获取旋转锁,因为旋转锁的IRQL比它们的还低.因此,一旦线程获取了旋转锁,直到释放它为止,不会再有其他现成获取此旋转锁了.好的驱动应该尽量减少拥有旋转锁的时间.它里面用了两次"在相同的处理器",但意思却矛盾...
自旋锁本身是没有IRQL这一说的,就像你拿到了一个令牌后,你可以号令武林了,但是单令牌自己是不能号令武林的,不知道你明白我想说的没