自旋锁问题???

[复制链接]
2725|4
 楼主| longwuyi 发表于 2007-5-30 06:13 | 显示全部楼层 |阅读模式
AN, pen, ov, TE, go
&nbsp;&nbsp;&nbsp;bool&nbsp;i=false;<br />&nbsp;&nbsp;&nbsp;LONG&nbsp;OpenHandleCount=0xFFFFFFFF;<br />&nbsp;&nbsp;&nbsp;VC++6.0对应汇编为:<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte&nbsp;ptr&nbsp;[ebp-8],0<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[ebp-0Ch],0FFFFFFFFh<br />&nbsp;&nbsp;&nbsp;都是一条指令执行完成:<br />&nbsp;&nbsp;&nbsp;为啥在有写WDM中对bool类型操作不加任何保护,而对LONG&nbsp;需要加自旋锁.如:<br />&nbsp;&nbsp;&nbsp;&nbsp;...<br />&nbsp;&nbsp;&nbsp;&nbsp;dx-&gtGotResources&nbsp;=&nbsp;true;<br />&nbsp;&nbsp;&nbsp;&nbsp;...<br />&nbsp;&nbsp;&nbsp;&nbsp;InterlockedIncrement(&dx-&gtOpenHandleCount);<br />&nbsp;&nbsp;&nbsp;&nbsp;...<br />&nbsp;&nbsp;&nbsp;且为32Bit的CPU
computer00 发表于 2007-5-30 09:07 | 显示全部楼层

好象是要根据需要才上锁的吧?

  
 楼主| longwuyi 发表于 2007-5-30 22:17 | 显示全部楼层

自旋锁问题???

在实际例子中:<br />实际上InterlockedIncrement(&dx-&gtOpenHandleCount);内部分就存在Lock加锁的部分.<br />而对BOOL类型操作使确定没有加锁的处理.<br /><br />32Bit&nbsp;CPU应该可以使用一条汇编指令完成LONG和bool类型的存储.<br />除非CPU在执行一条汇编指令期间也能被其它中断才会有问题.<br />从类型上看LONG实际占用4Bytes,而bool实际为1Byte(搞不懂)<br />
lenglx 发表于 2007-5-31 22:36 | 显示全部楼层

都不是一条指令能完成的。

先要取得结构的首地址,然后根据偏移来修改变量.<br /><br />dx-&gtGotResources&nbsp;=&nbsp;true;<br />只有一个写的过程,即使被其它进程中断,并修改了dx-&gtGotResources的内容,也没什么打紧,所以不需要LOCK。<br /><br />InterlockedIncrement(&dx-&gtOpenHandleCount);<br />过程是:&nbsp;读-&gt加1-&gt写入<br />在读出以后,在写入之前,是不允许被其它进程修改dx-&gtOpenHandleCount的值的,<br />所以需要保护.<br /><br />
ahwei 发表于 2007-6-2 21:30 | 显示全部楼层

楼主还不明白什么是自旋锁,建议看看os教材。

在楼主的这个例子中,并没有用到什么自旋锁,<br />InterlockedIncrement(&dx-&gtOpenHandleCount);只是在加一这条指令的时候锁主总线,免得被其他cpu打扰。<br />实际编译出来的汇编应该是lock&nbsp;inc&nbsp;var,&nbsp;或者是lock&nbsp;add&nbsp;var,&nbsp;1.<br />自旋锁时cpu在不断的自旋,把时间耗完。<br />还有楼主的这个到底时bool还是BOOL,在ddk中typedef&nbsp;long&nbsp;BOOL,BOOL&nbsp;就是long。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

61

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部