Alexander
驱动大牛
驱动大牛
  • 注册日期2002-02-04
  • 最后登录2005-06-16
  • 粉丝0
  • 关注0
  • 积分-5分
  • 威望-1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:951回复:2

哪位老大能给指点一下?先谢了。

楼主#
更多 发布于:2002-02-07 19:03
Walter Oney在他的Programming Windows Driver Model一书中说:
“最好在代码的一个部分使用ExInterlockedXxx互锁函数访问单链表或双链表(不包括S链表),在另一部分使用非互锁函数(InsertHeadList等等)。在使用一个非互锁原语前,应该提前获取调用使用的自旋锁。另外,应该限制低于或等于DISPATCH_LEVEL级的代码访问链表。”
既然链表操作都要同步,索性都用互锁的函数不好吗?那样不也就不会有书中后面例子中的死缩问题了吗?
真不明白!
lu0
lu0
论坛版主
论坛版主
  • 注册日期2001-06-10
  • 最后登录2016-04-05
  • 粉丝2
  • 关注0
  • 积分-6311分
  • 威望21111点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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指令操作时是独占的.
Regards, Lu Lin Webmaster of Inside Programming http://www.lu0s1.com
Alexander
驱动大牛
驱动大牛
  • 注册日期2002-02-04
  • 最后登录2005-06-16
  • 粉丝0
  • 关注0
  • 积分-5分
  • 威望-1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-02-12 23:35
我能这样理解吗?

在PASSIVE_LEVEL下,操作链表时最好能暂时关闭硬件中断,并且对链表的操作应该提前获得自旋锁,再使用InsertHeadList等;而在DISPATCH_LEVEL下就不必关中断。

但这样的话,是只有在确保只有1CPU访问该链表的情况下才用到ExInterlockedXxx吗?
请恕小弟愚鲁。

[编辑 -  2/12/02 作者: liuqun]
游客

返回顶部