同一处理器上有两个自旋锁?
-
26-09-2019 - |
题
两个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
保证同一内存总线上的所有处理器的交换以原子方式发生。因此它必须锁定内存总线,或者至少强制特定缓存行的唯一所有权。
不隶属于 StackOverflow