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

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

  3. 那么...这是否意味着:单个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 保证同一内存总线上的所有处理器的交换以原子方式发生。因此它必须锁定内存总线,或者至少强制特定缓存行的唯一所有权。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top