yyhabc
驱动小牛
驱动小牛
  • 注册日期2003-01-06
  • 最后登录2013-03-18
  • 粉丝0
  • 关注0
  • 积分327分
  • 威望47点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
阅读:1329回复:3

关于同步的问题

楼主#
更多 发布于:2003-02-10 15:18
一个关于同步的问题:
在一份微软的源代码中,有如下代码:
    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]
tjm
tjm
驱动小牛
驱动小牛
  • 注册日期2002-05-18
  • 最后登录2004-10-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-02-10 20:24
除了KeReleaseSpinLock必须放到{}外,你可能比微软硬一点。不过也不一定。
如果频繁调用KeAcquireSpinLock的话,不是提高效率的好办法。
yyhabc
驱动小牛
驱动小牛
  • 注册日期2003-01-06
  • 最后登录2013-03-18
  • 粉丝0
  • 关注0
  • 积分327分
  • 威望47点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-02-11 09:07
但是我觉得这不像是微软的错误。在我看的代码中,所有的代码全是这样,在读的时候不同步,在写的时候同步。而且,能确切知道会发生同步问题。
地板#
发布于:2003-02-12 09:37
你说的在写的时候同步是什么意思啊?有没有考虑过触发任务切换的条件啊?
游客

返回顶部