alarm.cc
来自「本次实验的目的在于掌握使用nachos中的线程序解决较为复杂的并发问题。实验内容」· CC 代码 · 共 65 行
CC
65 行
#include "copyright.h"
#include "Alarm.h"
#include "system.h"
void loopwhile(int which)
{
while(alarmclock->Getpausenum()!=0)
{
currentThread->Yield();
}
currentThread->Finish();
}
Alarm::Alarm(char *debugName)
{
name = debugName;
pausenum = 0;
alarm_queue = new List;
}
void
Alarm::Pause(int howLong)
{
pausenum ++;
if(pausenum ==1){
Thread *t = new Thread("while yeile thread");
t->Fork(loopwhile,0);
}
if(howLong <= 0)
return;
timeLeft = stats->totalTicks+howLong*TimerTicks*10000;
thread = currentThread;
alarm_queue->SortedInsert(currentThread, timeLeft);
IntStatus oldLevel = interrupt->SetLevel(IntOff);
currentThread->Sleep();
(void) interrupt->SetLevel(oldLevel);
}
void
Alarm::WakeUp()
{
Thread* thread1;
int ptime=-1;
IntStatus oldLevel1 = interrupt->SetLevel(IntOff);
thread1 = (Thread*) alarm_queue->SortedRemove(&ptime);
(void) interrupt->SetLevel(oldLevel1);
while(thread1!=NULL){
if(stats->totalTicks >=ptime )
{
scheduler->ReadyToRun(thread1);
pausenum--;
IntStatus oldLevel2 = interrupt->SetLevel(IntOff);
thread1 = (Thread*) alarm_queue->SortedRemove(&ptime);
(void) interrupt->SetLevel(oldLevel2);
continue;
}
else {
IntStatus oldLevel3 = interrupt->SetLevel(IntOff);
alarm_queue->SortedInsert(thread1,ptime);
(void) interrupt->SetLevel(oldLevel3);
break;
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?