两个 CPU 可以同时持有两个“不同”的自旋锁吗?
那么......这是否意味着:一个单一(单处理器)CPU 不能同时持有两个“不同”的自旋锁?
那么……这是否意味着:单个 CPU 上的自旋锁数量不能大于 1。
PS:“不同”暗示与不同内存资源相关的自旋锁。
有人知道自旋锁在内部是如何工作的吗?...我的意思是,他们会在测试集操作期间冻结总线吗?我用谷歌搜索过,但没有绝对的答案。
两个 CPU 可以同时持有两个“不同”的自旋锁吗?
那么......这是否意味着:一个单一(单处理器)CPU 不能同时持有两个“不同”的自旋锁?
那么……这是否意味着:单个 CPU 上的自旋锁数量不能大于 1。
PS:“不同”暗示与不同内存资源相关的自旋锁。
有人知道自旋锁在内部是如何工作的吗?...我的意思是,他们会在测试集操作期间冻结总线吗?我用谷歌搜索过,但没有绝对的答案。
自旋锁或多或少只是一个共享的 int,写入与之同步。处理器没有特殊标志。所以你可以获得不止一个自旋锁。(你不应该...)
为了防止单处理器系统锁定,Windows 将 IRQL 提升到DISPATCH_LEVEL
. 处理器只能在 运行一个“线程” DISPATCH_LEVEL
,因此在这些系统上同时锁定多个自旋锁是安全的。
实现应该是这样的:(不是 100% 正确,并且可能因细节而异)
LONG lock = 0;
KeAcquireSpinlock( ... )
{
// raise irql. etc.
while( InterlockedExchange( &lock, 1 ) != 0 )
/* do nothing*/;
}
KeReleaseSpinLock( ... )
{
InterlockedExchange( &lock, 0 );
// lower irql ... etc.
}
InterlockedExchange
保证交换在同一内存总线上的所有处理器上原子发生。所以它必须锁定内存总线,或者至少强制特定缓存行的唯一所有权。