paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1951回复:19

一个菜鸟的问题--自旋锁

楼主#
更多 发布于:2002-11-18 08:50
问题1:在NDIS中怎样编写一个自旋锁,又是如何定义的?
2:如有定义PUCHAR my_data 怎样给my_data加锁及解锁?
给个思路或例子!!
先谢了!
知之为知之,不知为不知 有错则改之
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-18 09:05
Passthru 里面不是有吗?看看就行了
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-18 09:10
Passthru 里面不是有吗?看看就行了

小弟是个新手,一看这个例子就头晕!!也不知道其所云是啥!!
还烦老兄你指点一二.
知之为知之,不知为不知 有错则改之
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-11-18 09:16
先在某处初始化
KSPIN_LOCK  SpinLock;
KeInitializeSpinLock( &SpinLock );

要对 my_data 操作时:
KIRQL  OldIrql;

KeAcquireSpinLock( &SpinLock, &OldIrql );
my_data = 123;
KeReleaseSpinLock( &SpinLock, OldIrql );
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-11-18 09:48
先在某处初始化
KSPIN_LOCK  SpinLock;
KeInitializeSpinLock( &SpinLock );

要对 my_data 操作时:
KIRQL  OldIrql;

KeAcquireSpinLock( &SpinLock, &OldIrql );
my_data = 123;
KeReleaseSpinLock( &SpinLock, OldIrql );


谢edust兄了!
在这个锁中是不是对所有在KeAcquireSpinLock和KeReleaseSpinLock
之间的内存变量及代码段都有效呀?
知之为知之,不知为不知 有错则改之
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-11-18 10:36
对,但为了语义合乎逻辑,最好一个锁对应一个要保护的数据结构(具体情况具体对待)。
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-11-18 10:55
对,但为了语义合乎逻辑,最好一个锁对应一个要保护的数据结构(具体情况具体对待)。

等俺调试好了回头再给你分
知之为知之,不知为不知 有错则改之
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-11-18 15:23
就这么着,谢过了!!
知之为知之,不知为不知 有错则改之
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-11-18 16:37
效果如何?可否给个反馈?
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-11-19 08:21
效果如何?可否给个反馈?

俺把这个锁加到自已的程序里了,本意望它能解决死机的问题,但还是不行,看来俺得另想办法了,不过还是要谢谢老兄的指点,因为俺又多学会了些东西!!
知之为知之,不知为不知 有错则改之
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-11-19 08:40
呵呵,我也是菜鸟,现学现买而已:)

再找找其它原因吧
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-11-21 18:09
呵呵,我也是菜鸟,现学现买而已:)

再找找其它原因吧

共同学习才有进步嘛!!
知之为知之,不知为不知 有错则改之
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-11-21 19:18
呵呵,同意
wangdacheng
驱动牛犊
驱动牛犊
  • 注册日期2002-10-01
  • 最后登录2003-03-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-11-22 12:32

我是这样认为的:
typedef struct __MyData {
  KSPIN_LOCK  m_SpinLock,
  ULONG m_lData
} MyData;

...

VOID MyFunction()
{
     MyData TestData;
     KIRQL OldIrql;

     KeInitializeSpinLock( &(TestData.m_SpinLock));
     KeAcquireSpinLock( &(TestData.m_SpinLock), &OldIrql );
     /* now your pg is runing at DISPATCH_LEVEL */
     TestData.m_lData = 123;
     KeReleaseSpinLock( &(TestData.m_SpinLock), OldIrql );
}

如果有用,就给分吧!
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-11-22 12:38
KeInitializeSpinLock要在程序初始化的时候调用,不是用一次就调用一次
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-11-22 13:13
mikeluo,VxD 的同步问题搞定了吗?
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-11-22 13:23
那个问题还没有搞定,先放一下,因为不知道究竟是那一部分的错误操作,因为这个不只是收发包,还有别的操作,先调试上层和底层通信这快呢,
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-11-22 13:33
使用自旋锁需要注意在acquire和release之间代码的执行时间应该是很短的(微秒级),即不能有I/O和Wait之类的操作,否则会有问题
hhhhhhh
驱动牛犊
驱动牛犊
  • 注册日期2002-01-03
  • 最后登录2004-03-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-11-22 23:58
自旋锁,
你就把它当做WIN32的\"临界区\"对象一样使用就好了.
千万注意:不要在其中过于消耗CPU时间
huangbeyond(校园人渣)
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-11-24 08:26
KeInitializeSpinLock要在程序初始化的时候调用,不是用一次就调用一次

对级了, 我看了一些资料及NDDK 里passthru的例子也是如此做的。
知之为知之,不知为不知 有错则改之
游客

返回顶部