我有这个内核代码,我在其中禁用中断以使该锁获取操作原子化,但是如果您看到最后一个 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); // 启用中断 }