阅读:1633回复:6
有高手帮我看一下spin lock的含义是否解释正确
Spin Lock为在共享内存(share memory)中互斥(mutual exclusion)独享内存资源所建的一种机制。因为共享内存的时候可以有很多进程共享同一段内存空间,所以,某些操作,如:有些原子操作(atomic operation)需要独享(exclusive access)某一段内存空间,这时候可以加上Spin Lock来做到这一点。
不知道对不对,请高手指点! 还有,有没有人能把windows下的 Spin Lock实现细节说一说! 我们一起来探讨! |
|
沙发#
发布于:2003-10-25 08:28
spin lock 主要是在smp 多处理器平台下完成对某些共享资源的同步
|
|
板凳#
发布于:2003-10-25 09:31
多cpu的同步
|
|
地板#
发布于:2003-10-25 16:37
谢谢各位大侠指点!
有没有好的,详细的专著论述它吗? 能不能提供给大家!谢谢! |
|
地下室#
发布于:2003-10-28 13:35
正如你所说,对于共享资源,当有多线程访问时,需要mutex。
多个CPU的情况也是如此,当遇到并行处理时,保有Spin Lock的资源能够保证同一事件,不仅仅只有一个线程能够访问,还能够保证同一时间,只有一个CPU能够访问该资源。 但是使用Spin Lock时应该注意调用IoAcquireSpinlock直到IoReleaseSpinLock,系统IRQL会被提升,有可能是,此时,必须注意。 |
|
|
5楼#
发布于:2003-10-28 13:35
正如你所说,对于共享资源,当有多线程访问时,需要mutex。
多个CPU的情况也是如此,当遇到并行处理时,保有Spin Lock的资源能够保证同一时间,不仅仅只有一个线程能够访问,还能够保证同一时间,只有一个CPU能够访问该资源。 但是使用Spin Lock时应该注意调用IoAcquireSpinlock直到IoReleaseSpinLock,系统IRQL会被提升,有可能是,此时,必须注意。 |
|
|
6楼#
发布于:2003-10-31 17:03
给你们发一个spin-lock的实现代码吧,我不保证和windows中的实现一致,但基本思想一样
typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK; VOID STDCALL KeInitializeSpinLock (PKSPIN_LOCK SpinLock) { *SpinLock = 0; } VOID FASTCALL KefAcquireSpinLockAtDpcLevel(PKSPIN_LOCK SpinLock) { ULONG i; if (*SpinLock >= 2) { DbgPrint(\"Lock %x has bad value %x\\n\", SpinLock, *SpinLock); KEBUGCHECK(0); } while ((i = InterlockedExchange((LONG *)SpinLock, 1)) == 1) { #ifndef MP DbgPrint(\"Spinning on spinlock %x current value %x\\n\", SpinLock, i); KEBUGCHECK(0); #else /* not MP */ /* Avoid reading the value again too fast , here need more process */ #endif /* MP */ } } VOID FASTCALL KefReleaseSpinLockFromDpcLevel(PKSPIN_LOCK SpinLock) { if (*SpinLock != 1) { DbgPrint(\"Releasing unacquired spinlock %x\\n\", SpinLock); KEBUGCHECK(0); } (void)InterlockedExchange((LONG *)SpinLock, 0); } |
|