OnebyOnePlease
驱动牛犊
驱动牛犊
  • 注册日期2004-05-13
  • 最后登录2010-03-19
  • 粉丝0
  • 关注0
  • 积分99分
  • 威望31点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
阅读:1040回复:2

关于如何理解SpinLock.

楼主#
更多 发布于:2004-06-02 11:39
我在研究netwall时碰到这断代码:
NdisAcquireSpinLock(&(pAdapt->PacketRecvLock));
    pPacketDesc = pAdapt->PacketRecvDesc;
    NdisReleaseSpinLock(&pAdapt->PacketRecvLock);
我对Spinlock理解的不够深刻,请各位师兄指点一二。
OnebyOnePlease
驱动牛犊
驱动牛犊
  • 注册日期2004-05-13
  • 最后登录2010-03-19
  • 粉丝0
  • 关注0
  • 积分99分
  • 威望31点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-06-03 14:02
3x,I see。
youngyt
驱动牛犊
驱动牛犊
  • 注册日期2003-11-23
  • 最后登录2006-12-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-06-02 14:22
不知你学过操作系统这门课没有,里面有一个PV原子操作,大概意思就是一个原子操作在用共享内存的时候,另一个进不来,除非第一个释放对内存的控制。那里用的是信号量来控制两个操作互斥的,不过用信号量的方法可以有更复杂的控制方法。

这里你问的是用互斥锁来解决上述问题,因为对某些全局变量操作的时候你必须保证这时不会有另一个函数对该变量进行操作,不然的话到底以谁的操作为准呢?所以当要操作某个全局变量前先去申请一个锁,如果没有申请成功(也就是说该变量正在被操作),那么这个NdisAcquireSpinLock就是阻塞等待锁的释放。如果申请成功,那么就可以对该变量安全进行操作了,这时其它的函数得不到锁就无法操作该变量。操作完成一定要记住释放锁,不然别人将永远无法操作该变量。

另一个要注意的是:并不是一个全局变量就要对应一个锁变量,一个锁变量可以用于多个变量,只是要知道哪把锁锁了哪个变量就行了。别申请释放错了 :D
游客

返回顶部