このカーネルコードでは、割り込みを無効にしてこのロック取得操作をアトミックにしますが、最後のelse条件が表示された場合、つまりロックが使用できない場合、スレッドはスリープ状態になり、スレッドがスリープ状態から戻った後にのみ割り込みが有効になります。私の質問は、このスレッドがスリープ状態から抜け出すまで、OS全体で割り込みが無効になるということです。
void Lock :: Acquisition()
{{
IntStatus oldLevel = Interrupt-> SetLevel(IntOff); //割り込みを無効にして、次のステートメントをアトミックにします
if(lockOwnerThread == currentThread)//要求しているスレッドがすでにロックを所有しているかどうかを確認する
{{
// printf( "SM:error:%sはすでにロックを所有しています\ n"、currentThread-> getName());
DEBUG('z'、 "SM:error:%sはすでにロックを所有しています\ n"、currentThread-> getName());
(void)割り込み-> SetLevel(oldLevel);
戻る;
}
if(lockOwnerThread == NULL)
{{
lockOwnerThread = currentThread; //ロック所有者の船が現在のスレッドに与えられます
DEBUG('z'、 "SM:ロック%sの所有権は%sに与えられます\ n"、name、currentThread-> getName());
}
そうしないと
{{
DEBUG('z'、 "SM:リクエストキューにスレッド%sを追加し、スリープ状態にします\ n"、currentThread-> getName());
queueForLock-> Append((void *)currentThread); //ロックがビジーなので、スレッドをキューに追加します。
currentThread-> Sleep(); //そして眠りにつく
}
(void)割り込み-> SetLevel(oldLevel); //割り込みを有効にします
}