我有这个内核代码,我在其中禁用中断以使该锁获取操作原子化,但是如果您看到最后一个 else 条件,即当锁不可用时,线程进入睡眠状态,并且只有在线程从睡眠状态恢复后才启用中断。我的问题是,整个操作系统都禁用中断,直到该线程退出睡眠?
无效锁::Acquire()
{
IntStatus oldLevel = 中断->SetLevel(IntOff); // 禁用中断以使以下语句具有原子性
if(lockOwnerThread == currentThread) //检查请求线程是否已经拥有锁
{
//printf("SM:error:%s 已经拥有锁\n",currentThread->getName());
DEBUG('z', "SM:error:%s 已经拥有锁\n",currentThread->getName());
(void) 中断->SetLevel(oldLevel);
返回;
}
如果(lockOwnerThread==NULL)
{
lockOwnerThread = 当前线程;// 锁拥有权赋予当前线程
DEBUG('z', "SM:锁%s的所有权给%s \n",name,currentThread->getName());
}
别的
{
DEBUG('z', "SM: 将线程 %s 添加到请求队列并使其进入睡眠状态\n",currentThread->getName());
queueForLock->Append((void *)currentThread); // 锁很忙,所以将线程添加到队列中;
当前线程->睡眠();// 然后去睡觉
}
(void) 中断->SetLevel(oldLevel); // 启用中断
}