1.在thread.h中添加priority属性和set,get方法
2.在thread.cc中修改Thread.Yield()方法
3.修改scheduler.cc中的ReadyToRun()方法
private: int priority; //priority of thread
pubclic:
int getPriority(){return priority;}
void setPriority(int p)
{
if(p > PRIORITY_MAX) priority = PRIORITY_MAX;
else if(p < PRIORITY_MIN) priority = PRIORITY_MIN;
priority = p;
}
2.在thread.cc中修改Thread.Yield()方法
if (nextThread != NULL) { //如果下一个线程不为空
if(nextThread->getPriority() > this->getPriority()) //如果下一个线程优先级比当前线程低,继续运行当前线程
scheduler->ReadyToRun(nextThread);
else //否则
{
scheduler->ReadyToRun(this); //将该线程的状态设置为就绪状态
scheduler->Run(nextThread); //调度器运行下一个线程
}
}
3.修改scheduler.cc中的ReadyToRun()方法
readyList->SortedInsert((void *)thread,thread->getPriority());
//readyList->Append((void *)thread); //假如就绪队列
4.修改测试文件
void
PrintPriority(int tid)
{
for(int i=0;i!=3;i++)
{
printf("*** tid:%d looped %d times, priority:%d\n",tid,i,currentThread->getPriority());
currentThread->Yield();
}
}
void
TestPriority()
{
for(int i = 6; i!=0;i--)
{
Thread* t = Thread::getInstance("thread");
t->setPriority(i);
if(t!=NULL)
t->Fork(PrintPriority,t->getTid());
}
}
测试结果如图: