WQXNETQIQI
驱动大牛
驱动大牛
  • 注册日期2006-06-12
  • 最后登录2010-10-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1076点
  • 贡献值0点
  • 好评度895点
  • 原创分1分
  • 专家分0分
阅读:2076回复:0

[恢复]这种情况下的全局变量是否需要自旋锁(spin lock)呢?

楼主#
更多 发布于:2007-01-02 21:37
  这是在 2006年12月23日 19:58:46 GMT 检索到的 http://bbs.driverdevelop.com/simple/index.php?t117118.html 的 G o o g l e 缓存内容。
G o o g l e 已先预览各网页,拍下网页的快照存档。
这网页可能有更新的版本,请按此查看最新版。
本缓存网页可能引用了已经不存在的图片。单击此处,只查看缓存文本。
请使用网址 http://www.google.com/search?&q=cache:vgSOz7qG8mYJ:bbs.driverdevelop.com/simple/index.php%3Ft117118.html+%E8%BF%99%E7%A7%8D%E6%83%85%E5%86%B5%E4%B8%8B%E7%9A%84%E5%85%A8%E5%B1%80%E5%8F%98%E9%87%8F%E6%98%AF%E5%90%A6%E9%9C%80%E8%A6%81%E8%87%AA%E6%97%8B%E9%94%81(spin+lock)%E5%91%A2%EF%BC%9F&hl=zh-CN&gl=cn&ct=clnk&cd=1 链接此页或将其做成书签。


Google 和网页作者无关,不对网页的内容负责。
这些搜索字词都已标明如下:  这  种  情况  下  全局  变量  是否  需要  自  旋  锁  spin  lock  
 
 

--------------------------------------------------------------------------------


驱动程序开发网技术社区 -> Kernel Mode discussion and Soft Driver -> 这种情况下的全局变量是否需要自旋锁(spin lock)呢?  登录 -> 注册 -> 回复主题 -> 发表主题
 



pilixuanke 2006-09-02 09:40
在一个驱动中有一个全局变量,用于与用户层程序通信,在DispatchDeviceControl中会改变与查询它的值,在另外两个函数中需要访问它,即查询它的值是多少?请问是否需要为这个全局变量加一个spin lock呢?
  我的想法是:因为只有在一个函数中改变它,这个函数必然是运行于某一个线程中,所以没有必要给它加spin lock, 即使多CPU的情况下,不可能将一个函数的不同部分分给两个CPU来运行吧。
  不知我的想法对不?请各位指教!  
 

zzq191 2006-09-02 15:25
当然有可能的
 

pilixuanke 2006-09-02 15:34
QUOTE:
引用第1楼zzq191于2006-09-02 15:25发表的“”:
当然有可能的


  为什么呢?难道对称式多CPU的情况下采取的分配算法会将同一个函数的不同部分分给两个CPU来运行?这样有点说不过去呀?虽然我对其工作算法不清楚。
请赐教!
 
 

drwch 2006-09-02 16:30
共享写才需要SPINLOCK,单写+共享读不需要
 

pilixuanke 2006-09-02 17:16
QUOTE:
引用第3楼drwch于2006-09-02 16:30发表的“”:
共享写才需要SPINLOCK,单写+共享读不需要


It is my thought.
But I am not sure!

 
 

wowocock 2006-09-02 18:24
有比没好  。。。。。
 

tooflat 2006-09-03 00:32
在某些情况下共享读也需要做互斥的,因为可能根据读出来的值作不同的处理,关键还是要看具体需求。
 

tooflat 2006-09-03 00:33
如果只是数值,可以考虑InterlockedXXX函数,效率比较高。
 

rayyang2000 2006-09-04 07:44
先要分析你这3个函数会不会同时在运行,如果有这种机会,而你查询到的数值对你的应用又很重要,那lock就是必须的。

即使要用lock,也不一定就可以用spinlock。如果你的3个函数全都在dispatch_level,那只能用spinlock;如果你的3个函数在passive_level,那用mutex就可以搞定,没有必要非得用spinlock,毕竟spinlock的代码是有要求的,不是任何时候都可以用。
 

pilixuanke 2006-09-04 09:33
QUOTE:
引用第5楼wowocock于2006-09-02 18:24发表的“”:
有比没好  。。。。。


谢谢wowo大侠!

如果加上的话肯定是安全的,但是要没必要的话也会给系统带来一些负担,虽然可能这一小点的负荷对系统来说根本算不了什么!但是俺觉得把这个问题理解清楚了对以后写大点的程序会更好点。呵呵  
 

pilixuanke 2006-09-04 09:38
QUOTE:
引用第6楼tooflat于2006-09-03 00:32发表的“”:
在某些情况下共享读也需要做互斥的,因为可能根据读出来的值作不同的处理,关键还是要看具体需求。

toolflat大侠说的是。要想修改的值立即生效,还是做一下互斥好。


QUOTE:
引用第7楼tooflat于2006-09-03 00:33发表的“”:
如果只是数值,可以考虑InterlockedXXX函数,效率比较高。

是一个数值变量,是否可以用InterlockedExchange给其赋值呢?另外这种原子操作在SMP上应该也没什么问题吧?
 
 

pilixuanke 2006-09-04 09:49
QUOTE:
引用第8楼rayyang2000于2006-09-04 07:44发表的“”:
先要分析你这3个函数会不会同时在运行,如果有这种机会,而你查询到的数值对你的应用又很重要,那lock就是必须的。

即使要用lock,也不一定就可以用spinlock。如果你的3个函数全都在dispatch_level,那只能用spinlock;如果你的3个函数在passive_level,那用mutex就可以搞定,没有必要非得用spinlock,毕竟spinlock的代码是有要求的,不是任何时候都可以用。


先要分析你这3个函数会不会同时在运行,如果有这种机会、、、
////////////////
这个怎么进行分析呢?小弟现在不是很懂。我把这三个函数说出来看rayyang2000管理员能否给小弟分析一下呢?呵呵  
(1)、在IRP_MJ_DEVICE_CONTROL中要修改它。即上层应用程序通过DeviceIoControl来修改它。
(2)、在IRP_MJ_INTERNAL_DEVICE_CONTROL中要读取它的值。从而判断是否执行相关动作。
(3)、在IRP_MJ_INTERNAL_DEVICE_CONTROL某个操作中会设置一个completion函数,在这个completion函数中也会用到它。
这三个函数会不会同时运行呢?

如果你的3个函数在passive_level,那用mutex就可以搞定,没有必要非得用spinlock、、、
///////////////////
上面这三个函数应该不会都在PASSIVE_LEVEL上运行吧?

请指教!  
 

ljkong 2006-09-04 11:18
个人感觉,2个cpu还是会有问题,函数是可以重入的话,全局变量还是可以被改变的,所以最好还是有spinlock的好
 

pilixuanke 2006-09-04 13:48
QUOTE:
引用第12楼ljkong于2006-09-04 11:18发表的“”:
个人感觉,2个cpu还是会有问题,函数是可以重入的话,全局变量还是可以被改变的,所以最好还是有spinlock的好


谢谢漠星(ljkong)!
函数重入的话也仅仅是当对IRP_MJ_INTERNAL_DEVICE_CONTROL函数才有影响啊?而这个函数是当上层应用程序调用的时候才会调用此函数。不太可能在用户两次选择的间隙这处函数还没有被调用完呀?  
 

devia 2006-09-04 18:53
QUOTE:
引用第8楼rayyang2000于2006-09-04 07:44发表的“”:
先要分析你这3个函数会不会同时在运行,如果有这种机会,而你查询到的数值对你的应用又很重要,那lock就是必须的。

即使要用lock,也不一定就可以用spinlock。如果你的3个函数全都在dispatch_level,那只能用spinlock;如果你的3个函数在passive_level,那用mutex就可以搞定,没有必要非得用spinlock,毕竟spinlock的代码是有要求的,不是任何时候都可以用。


敬仰!!!
 

rayyang2000 2006-09-05 08:45
QUOTE:
引用第11楼pilixuanke于2006-09-04 11:49发表的“”:
先要分析你这3个函数会不会同时在运行,如果有这种机会、、、
////////////////
这个怎么进行分析呢?小弟现在不是很懂。我把这三个函数说出来看rayyang2000管理员能否给小弟分析一下呢?呵呵
(1)、在IRP_MJ_DEVICE_CONTROL中要修改它。即上层应用程序通过DeviceIoControl来修改它。
(2)、在IRP_MJ_INTERNAL_DEVICE_CONTROL中要读取它的值。从而判断是否执行相关动作。
(3)、在IRP_MJ_INTERNAL_DEVICE_CONTROL某个操作中会设置一个completion函数,在这个completion函数中也会用到它。
这三个函数会不会同时运行呢?


肯定会同时运行了,但是,如果你的应用并不在乎前一秒和后一秒的数据的变化,那加不加都无所谓。


QUOTE:

如果你的3个函数在passive_level,那用mutex就可以搞定,没有必要非得用spinlock、、、
///////////////////
上面这三个函数应该不会都在PASSIVE_LEVEL上运行吧?


没错,都有可能在dispatch上,那只好用spinlock咯。如果哪个数值只是一个ULONG之类的开关、计数变量,那就用Interlockedxxxx就好了,也没啥复杂的
 

pilixuanke 2006-09-05 11:32
QUOTE:
引用第15楼rayyang2000于2006-09-05 08:45发表的“”:

没错,都有可能在dispatch上,那只好用spinlock咯。如果哪个数值只是一个ULONG之类的开关、计数变量,那就用Interlockedxxxx就好了,也没啥复杂的


谢谢rayyang2000大侠!
嗯!要共享的全局变量就是一个数值变量,看来用Interlockedxxx比较合适。


QUOTE:
肯定会同时运行了,但是,如果你的应用并不在乎前一秒和后一秒的数据的变化,那加不加都无所谓。

DX能否将这种情况举个具体的例子呢?什么情况下会出现这三个函数并发执行?谢啦  
 



查看完整版本: [-- 这种情况下的全局变量是否需要自旋锁(spin lock)呢? --] [-- top --]



Powered by PHPWind v4.3.2 Code ? 2003-05 PHPWind
Time 0.030863 second(s),query:4 Gzip enabled

You can contact us
驱动开发者 呵呵
游客

返回顶部