|
| 自旋锁问题??? |
| 新闻出处: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。
|
| 【关闭】 【打印】 |
|
|
|
|