门关键词: 霍尼韦尔微动开关 电子继电器 非晶质变压器 高压电容放电线圈 akg监听耳机 上海贾永连接器 无线耳麦价格
IC库存(8958万) PDF资料(329万) IC价格 IC求购 资讯 技术资料
电子元器件搜索:
维库电子市场网是知名的电子元器件交易网站,为电子生产企业提供IC库存和技术资料查询服务。
自旋锁问题???
新闻出处:21ic 发布时间: 2007-06-02
longwuyi 发布于 2007-5-30 6:13:00
   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


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

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



lenglx 发布于 2007-5-31 22:36:00
先要取得结构的首地址,然后根据偏移来修改变量.

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

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




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


关闭】 【打印
 
相关专题
 
友情链接:
© 2007 电子元件网 网站地图