⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 alarm.cc

📁 本次实验的目的在于掌握使用nachos中的线程序解决较为复杂的并发问题。实验内容分三部分:实现事件栅栏原语并进行正确性测试;实现闹钟原语并进行正确性测试;利用事件栅栏和闹钟原语来解决电梯问题(详细内容
💻 CC
字号:
#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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -