阅读:4277回复:22
只能用spinlock来解决问题?
请问内核对象:Event(事件),Mutex(互斥量), Semaphore(信号灯)等是否不能用在多CPU场合,只能用spinlock来解决问题?
|
|
沙发#
发布于:2008-01-12 17:07
引用楼主bjab于2008-01-12 16:22发表的 只能用spinlock来解决问题? : 是啊,只有spinlock是用于多CPU同步的 |
|
板凳#
发布于:2008-01-12 20:15
方法很多,执行体资源,临界区,push lock 等等都可以
|
|
|
地板#
发布于:2008-01-12 20:16
在WIN2000中微软大部分使用spinlock来解决同步问题
后来在XP中使用了push lock(支持读或写共享访问),使系统效率得到了较大提升,同时也不用提升到DPC level,不过push lock没有提供相应接口,驱动中的话,可以使用执行体资源,效果很好 |
|
|
地下室#
发布于:2008-01-12 22:06
引用楼主bjab于2008-01-12 16:22发表的 只能用spinlock来解决问题? : 这些在多核环境中都可以用。 |
|
5楼#
发布于:2008-01-12 22:07
WQXNETQIQI 受教了
我还以为只有spin lock这东西能用于多CPU同步, |
|
6楼#
发布于:2008-01-12 22:26
唉,WQXNETQIQI 答非所问,还是我来说说吧。
Event之类的可等待内核对象完全可以用在多CPU上。 楼主的误解恐怕源于DDK文档片面强调SpinLock适用于多CPU这一点。 实际上SpinLock和Event不是一个层次的东西。前者主要用于保证原子操作,后者才是用于同步的,而且后者的实现依赖前者。 在单CPU上,等待对象的内部实现用提升IRQL到DISPATCH_LEVEL的办法保证原子操作,而多CPU用的是SpinLock。所以不管单CPU还是多CPU,Event就是Event,用法一样。 可等待内核对象的限制是不能在DISPATCH_LEVEL上被等待,此时SpinLock才用来替代它们实现“同步”操作。 |
|
|
7楼#
发布于:2008-01-12 22:59
楼主想问应该是“如何在多CPU上不用SPINLOCK实现数据同步”才对吧?
spinlock对效率有较大损耗,因此多CPU上尽量使用执行体资源或push lock~~ event只能用来做自己的线程间的同步,只有执行体资源、PUSHLOCK或SPINLOCK才可以用做系统所有线程间的数据同步! SpinLock做非dispatch_level下的同步也很常用,win2000中很多非dispatch_level的数据同步也是用spinlock实现的 |
|
|
8楼#
发布于:2008-01-13 20:21
视优先级而定吧
假如你需要同步的代码有一些可能在DISPATCH_LEVEL,那么就应该用SpinLock了 |
|
9楼#
发布于:2008-01-14 10:32
我在内核线程中使用KeWaitForSingleObject等待KMutex对象,导致计算机重启动,但单CPU下运行正常,不知为什么?还望各位大侠指教。
|
|
10楼#
发布于:2008-01-14 11:38
那么是说像mutex这样的内核对象也能用于多CPU多线程之间的同步?还有,执行体资源怎么用?
|
|
11楼#
发布于:2008-01-14 14:35
引用第7楼WQXNETQIQI于2008-01-12 22:59发表的 : 1,楼主问的并不是“如何在内核实现高效的读写锁”,只是同步的话,一般的可等待对象都可以啊。你扯出执行体资源和PushLock,当然不切题。 2,都说了,SpinLock和Event之类的可等待对象(包括执行体资源)不是一个层次的东西,不要片面的比较。 3,何谓“系统所有线程”?你倒是用执行体资源让你的线程和系统的延迟写线程同步一下试试。别的线程不和你的线程用同个可等待对象,你怎么同步?用同一个对象的话,Event也一样可以,只是同步的方式不同而已:Event是事件,Mutex是互斥,ERESOURCE是读写锁。 4,对少量数据做简单操作时,当然用SpinLock比较高效。SpinLock实现的原子操作可以看作轻量级的“同步”,你要认定这就是一种同步那也无所谓。 |
|
|
12楼#
发布于:2008-01-14 14:39
引用第9楼bjab于2008-01-14 10:32发表的 : 用虚拟机自己调试一下看看啊。 |
|
|
13楼#
发布于:2008-01-14 14:44
引用第10楼bjab于2008-01-14 11:38发表的 : 当然可以,DDK里的源代码没有分单CPU和多CPU两个版本吧,所以Event就是Event。 执行体资源就是ERESOURCE,用法就不用问了吧,自己查DDK文档嘛。 |
|
|
14楼#
发布于:2008-01-15 21:51
SpinLock:就像n多人早上抢一个厕所,谁能先进去把门锁上就是谁的。
Event:当侧所里的人出来后,大家可以抢了。 |
|
15楼#
发布于:2008-01-16 09:55
引用第14楼GoodOnline于2008-01-15 21:51发表的 : 很形象,哈哈 |
|
16楼#
发布于:2008-01-16 12:55
引用第14楼GoodOnline于2008-01-15 21:51发表的 : Event也分Synchronous和Notification的 |
|
17楼#
发布于:2008-01-31 12:13
引用第16楼AlexSho于2008-01-16 12:55发表的 : 两者的区别是虾米呢? Synchronous 的 Event 是不是只满足多个 wait 线程中的一个,其他继续 wait 啊? |
|
|
18楼#
发布于:2008-01-31 16:13
引用第7楼WQXNETQIQI于2008-01-12 22:59发表的 : 比如用IoCreateNotificationEvent创建一个命名事件,不是各个驱动之间也可以相互同步了吗? |
|
|
19楼#
发布于:2008-01-31 16:17
ANY LEVEL SPIN_LOCK也有人实现了~哈哈
|
|
|
上一页
下一页