阅读:1336回复:3
关于同步的问题
一个关于同步的问题:
在一份微软的源代码中,有如下代码: if(PendingStop == deviceExtension->DeviceState) { KeAcquireSpinLock(&deviceExtension->DevStateLock, &oldIrql); RESTORE_PREVIOUS_PNP_STATE(deviceExtension); deviceExtension->QueueState = AllowRequests; ASSERT(deviceExtension->DeviceState == Working); KeReleaseSpinLock(&deviceExtension->DevStateLock, oldIrql); ProcessQueuedRequests(deviceExtension); } 可以看到他在读设备状态的时候,没有进行同步,也就是说,设备状态在if(PendingStop == deviceExtension->DeviceState) 之后, KeAcquireSpinLock(&deviceExtension->DevStateLock, &oldIrql)之前可能改变,这样的话,此段代码就会出错。与读设备状态相反,它在改变设备状态的时候进行了同步,我认为的代码应该是这样: KeAcquireSpinLock(&deviceExtension->DevStateLock, &oldIrql); if(PendingStop == deviceExtension->DeviceState) { RESTORE_PREVIOUS_PNP_STATE(deviceExtension); deviceExtension->QueueState = AllowRequests; ASSERT(deviceExtension->DeviceState == Working); KeReleaseSpinLock(&deviceExtension->DevStateLock, oldIrql); ProcessQueuedRequests(deviceExtension); } 不知各位大虾有没有高见。 [编辑 - 2/10/03 by yyhabc] |
|
沙发#
发布于:2003-02-12 09:37
你说的在写的时候同步是什么意思啊?有没有考虑过触发任务切换的条件啊?
|
|
板凳#
发布于:2003-02-11 09:07
但是我觉得这不像是微软的错误。在我看的代码中,所有的代码全是这样,在读的时候不同步,在写的时候同步。而且,能确切知道会发生同步问题。
|
|
地板#
发布于:2003-02-10 20:24
除了KeReleaseSpinLock必须放到{}外,你可能比微软硬一点。不过也不一定。
如果频繁调用KeAcquireSpinLock的话,不是提高效率的好办法。 |
|