阅读:2077回复:0
[恢复]这种情况下的全局变量是否需要自旋锁(spin lock)呢?
这是在 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 |
|
|