スピンロックは、多かれ少なかれ、書き込みが同期される共有intにすぎません。プロセッサに特別なフラグはありません。したがって、複数のスピンロックを取得できます。(すべきではありません...)
ユニプロセッサシステムがロックアップするのを防ぐために、windowsはIRQLをに上げDISPATCH_LEVEL
ます。プロセッサはで実行できる「スレッド」を1つだけにすることができる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
同じメモリバス上のすべてのプロセッサに対してアトミックに交換が行われることを保証します。したがって、メモリバスをロックするか、少なくとも特定のキャッシュラインの唯一の所有権を強制する必要があります。