2
  1. 两个 CPU 可以同时持有两个“不同”的自旋锁吗?

  2. 那么......这是否意味着:一个单一(单处理器)CPU 不能同时持有两个“不同”的自旋锁?

  3. 那么……这是否意味着:单个 CPU 上的自旋锁数量不能大于 1。

PS:“不同”暗示与不同内存资源相关的自旋锁。


有人知道自旋锁在内部是如何工作的吗?...我的意思是,他们会在测试集操作期间冻结总线吗?我用谷歌搜索过,但没有绝对的答案。

4

1 回答 1

2

自旋锁或多或少只是一个共享的 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保证交换在同一内存总线上的所有处理器上原子发生。所以它必须锁定内存总线,或者至少强制特定缓存行的唯一所有权。

于 2010-08-05T12:18:02.970 回答