阅读:950回复:2
哪位老大能给指点一下?先谢了。
Walter Oney在他的Programming Windows Driver Model一书中说:
“最好在代码的一个部分使用ExInterlockedXxx互锁函数访问单链表或双链表(不包括S链表),在另一部分使用非互锁函数(InsertHeadList等等)。在使用一个非互锁原语前,应该提前获取调用使用的自旋锁。另外,应该限制低于或等于DISPATCH_LEVEL级的代码访问链表。” 既然链表操作都要同步,索性都用互锁的函数不好吗?那样不也就不会有书中后面例子中的死缩问题了吗? 真不明白! |
|
沙发#
发布于:2002-02-11 10:05
假定PASSIVE LEVEL的ROUTINE获得了SPIN LOCK. 此时一个ISR被调用, ISR对SPIN LOCK的获取会失败. 但是ISR运行于DISPATCH LEVEL或更高, PASSIVE LEVEL的代码就没有机会继续执行, 就不能释放SPINLOCK. ISR和PASSIVE LEVEL的代码就死锁了.
ExInterlockedXxx提供原子级的内存访问. 即使是多CPU下, APIC总线会协调CPU对内存总线的访问. 确保只有1CPU能访问该内存. 该函数并不确保整个链表的完整性. 只保证链表中某个DWORD值在1条ASM指令操作时是独占的. |
|
|
板凳#
发布于:2002-02-12 23:35
我能这样理解吗?
: 在PASSIVE_LEVEL下,操作链表时最好能暂时关闭硬件中断,并且对链表的操作应该提前获得自旋锁,再使用InsertHeadList等;而在DISPATCH_LEVEL下就不必关中断。 但这样的话,是只有在确保只有1CPU访问该链表的情况下才用到ExInterlockedXxx吗? 请恕小弟愚鲁。 [编辑 - 2/12/02 作者: liuqun] |
|