打印

自旋锁问题???

[复制链接]
1806|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
longwuyi|  楼主 | 2007-5-30 06:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AN, pen, ov, TE, go
   bool i=false;
   LONG OpenHandleCount=0xFFFFFFFF;
   VC++6.0对应汇编为:
    mov     byte ptr [ebp-8],0
    mov    dword ptr [ebp-0Ch],0FFFFFFFFh
   都是一条指令执行完成:
   为啥在有写WDM中对bool类型操作不加任何保护,而对LONG 需要加自旋锁.如:
    ...
    dx->GotResources = true;
    ...
    InterlockedIncrement(&dx->OpenHandleCount);
    ...
   且为32Bit的CPU

相关帖子

沙发
computer00| | 2007-5-30 09:07 | 只看该作者

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

使用特权

评论回复
板凳
longwuyi|  楼主 | 2007-5-30 22:17 | 只看该作者

自旋锁问题???

在实际例子中:
实际上InterlockedIncrement(&dx->OpenHandleCount);内部分就存在Lock加锁的部分.
而对BOOL类型操作使确定没有加锁的处理.

32Bit CPU应该可以使用一条汇编指令完成LONG和bool类型的存储.
除非CPU在执行一条汇编指令期间也能被其它中断才会有问题.
从类型上看LONG实际占用4Bytes,而bool实际为1Byte(搞不懂)

使用特权

评论回复
地板
lenglx| | 2007-5-31 22:36 | 只看该作者

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

先要取得结构的首地址,然后根据偏移来修改变量.

dx->GotResources = true;
只有一个写的过程,即使被其它进程中断,并修改了dx->GotResources的内容,也没什么打紧,所以不需要LOCK。

InterlockedIncrement(&dx->OpenHandleCount);
过程是: 读->加1->写入
在读出以后,在写入之前,是不允许被其它进程修改dx->OpenHandleCount的值的,
所以需要保护.

使用特权

评论回复
5
ahwei| | 2007-6-2 21:30 | 只看该作者

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

在楼主的这个例子中,并没有用到什么自旋锁,
InterlockedIncrement(&dx->OpenHandleCount);只是在加一这条指令的时候锁主总线,免得被其他cpu打扰。
实际编译出来的汇编应该是lock inc var, 或者是lock add var, 1.
自旋锁时cpu在不断的自旋,把时间耗完。
还有楼主的这个到底时bool还是BOOL,在ddk中typedef long BOOL,BOOL 就是long。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

61

帖子

0

粉丝