阅读:1951回复:19
一个菜鸟的问题--自旋锁
问题1:在NDIS中怎样编写一个自旋锁,又是如何定义的?
2:如有定义PUCHAR my_data 怎样给my_data加锁及解锁? 给个思路或例子!! 先谢了! |
|
|
沙发#
发布于:2002-11-18 09:05
Passthru 里面不是有吗?看看就行了
|
|
板凳#
发布于:2002-11-18 09:10
Passthru 里面不是有吗?看看就行了 小弟是个新手,一看这个例子就头晕!!也不知道其所云是啥!! 还烦老兄你指点一二. |
|
|
地板#
发布于:2002-11-18 09:16
先在某处初始化
KSPIN_LOCK SpinLock; KeInitializeSpinLock( &SpinLock ); 要对 my_data 操作时: KIRQL OldIrql; KeAcquireSpinLock( &SpinLock, &OldIrql ); my_data = 123; KeReleaseSpinLock( &SpinLock, OldIrql ); |
|
地下室#
发布于:2002-11-18 09:48
先在某处初始化 谢edust兄了! 在这个锁中是不是对所有在KeAcquireSpinLock和KeReleaseSpinLock 之间的内存变量及代码段都有效呀? |
|
|
5楼#
发布于:2002-11-18 10:36
对,但为了语义合乎逻辑,最好一个锁对应一个要保护的数据结构(具体情况具体对待)。
|
|
6楼#
发布于:2002-11-18 10:55
对,但为了语义合乎逻辑,最好一个锁对应一个要保护的数据结构(具体情况具体对待)。 等俺调试好了回头再给你分 |
|
|
7楼#
发布于:2002-11-18 15:23
就这么着,谢过了!!
|
|
|
8楼#
发布于:2002-11-18 16:37
效果如何?可否给个反馈?
|
|
9楼#
发布于:2002-11-19 08:21
效果如何?可否给个反馈? 俺把这个锁加到自已的程序里了,本意望它能解决死机的问题,但还是不行,看来俺得另想办法了,不过还是要谢谢老兄的指点,因为俺又多学会了些东西!! |
|
|
10楼#
发布于:2002-11-19 08:40
呵呵,我也是菜鸟,现学现买而已:)
再找找其它原因吧 |
|
11楼#
发布于:2002-11-21 18:09
呵呵,我也是菜鸟,现学现买而已:) 共同学习才有进步嘛!! |
|
|
12楼#
发布于:2002-11-21 19:18
呵呵,同意
|
|
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 ); } 如果有用,就给分吧! |
|
14楼#
发布于:2002-11-22 12:38
KeInitializeSpinLock要在程序初始化的时候调用,不是用一次就调用一次
|
|
|
15楼#
发布于:2002-11-22 13:13
mikeluo,VxD 的同步问题搞定了吗?
|
|
16楼#
发布于:2002-11-22 13:23
那个问题还没有搞定,先放一下,因为不知道究竟是那一部分的错误操作,因为这个不只是收发包,还有别的操作,先调试上层和底层通信这快呢,
|
|
|
17楼#
发布于:2002-11-22 13:33
使用自旋锁需要注意在acquire和release之间代码的执行时间应该是很短的(微秒级),即不能有I/O和Wait之类的操作,否则会有问题
|
|
18楼#
发布于:2002-11-22 23:58
自旋锁,
你就把它当做WIN32的\"临界区\"对象一样使用就好了. 千万注意:不要在其中过于消耗CPU时间 |
|
|
19楼#
发布于:2002-11-24 08:26
KeInitializeSpinLock要在程序初始化的时候调用,不是用一次就调用一次 对级了, 我看了一些资料及NDDK 里passthru的例子也是如此做的。 |
|
|