线程的状态和转换_第1页
线程的状态和转换_第2页
线程的状态和转换_第3页
线程的状态和转换_第4页
线程的状态和转换_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验线程的状态和转换实验目的调试线程在各种状态间的转换过程,熟悉线程的状态和转换。通过为线程增加挂起状态,加深对线程状态的理解。线程的状态和其转换过程线程控制块中的状态域

及线程状态的枚举定义typedef struct_THREAD{ ……

UCHARState;

//线程当前状态 ……

}THREAD;typedefenum_THREAD_STATE{ Zero, //线程状态转换过程中的中间状态 Ready, //就绪 Running, //运行 Waiting, //等待(阻塞) Terminated //结束}THREAD_STATE;线程处于运行、就绪、阻塞状态时

线程控制块的位置线程控制块都是从系统内存池中分配的!运行状态:全局变量PspCurrentThread指向处于运行状态线程的线程控制块。就绪状态:线程控制块在其优先级对应的就绪队列中。阻塞状态:线程控制块在同步对象的等待队列中。线程状态转换包括:线程控制块中状态域的变化,线程控制块位置的变化等。线程由阻塞状态进入就绪状态的源代码PTHREAD

PspWakeThread(

INPLIST_ENTRYWaitListHead,

INSTATUSWaitStatus

)

{

PTHREADThread; if(!ListIsEmpty(WaitListHead)){

Thread=CONTAINING_RECORD(WaitListHead->Next,THREAD,StateListEntry);

PspUnwaitThread(Thread);

PspReadyThread(Thread);

Thread->WaitStatus=WaitStatus; }else{ Thread=NULL;

} returnThread;

}VOIDPspUnwaitThread( INPTHREADThread ){ ASSERT(Waiting==Thread->State); ListRemoveEntry(&Thread->StateListEntry); Thread->State=Zero; if(STATUS_TIMEOUT==Thread->WaitStatus){ KeUnregisterTimer(&Thread->WaitTimer); }}VOIDPspReadyThread( PTHREADThread ){ ASSERT(NULL!=Thread); ASSERT(Zero==Thread->State||Running==Thread->State); // //将线程插入其优先级对应的就绪队列的队尾,并设置就绪位图中对应的位。

//最后将线程的状态修改为就绪状态。

// ListInsertTail(&PspReadyListHeads[Thread->Priority],&Thread->StateListEntry); BIT_SET(PspReadyBitmap,Thread->Priority); Thread->State=Ready;}线程由运行状态进入就绪状态的源代码PCONTEXTPspSelectNextThread( VOID ){ …… if(NULL!=PspCurrentThread&&Running==PspCurrentThread->State){ if(0!=PspReadyBitmap&&HighestPriority>PspCurrentThread->Priority){ ListInsertHead(&PspReadyListHeads[PspCurrentThread->Priority], &PspCurrentThread->StateListEntry); BIT_SET(PspReadyBitmap,PspCurrentThread->Priority); PspCurrentThread->State=Ready; } …… } ……}线程由就绪状态进入运行状态的源代码PCONTEXTPspSelectNextThread( VOID ){ …… PspCurrentThread=CONTAINING_RECORD(PspReadyListHeads[HighestPriority].Next, THREAD,StateListEntry); ObRefObject(PspCurrentThread);

PspUnreadyThread(PspCurrentThread); PspCurrentThread->State=Running; ……}VOIDPspUnreadyThread( PTHREADThread ){ ASSERT(NULL!=Thread&&Ready==Thread->State); ListRemoveEntry(&Thread->StateListEntry); if(ListIsEmpty(&PspReadyListHeads[Thread->Priority])){ BIT_CLEAR(PspReadyBitmap,Thread->Priority); } Thread->State=Zero;}线程由运行状态进入阻塞状态的源代码STATUSPspWait( INPLIST_ENTRYWaitListHead, INULONGMilliseconds ){ …… ListInsertTail(WaitListHead,&PspCurrentThread->StateListEntry); PspCurrentThread->State=Waiting; //当前线程进入等待状态后需要让出处理器(让权等待),执行线程调度。 PspThreadSchedule();

//zzZ... ……}为线程增加挂起状态命令:suspendThreadID和resumeThreadIDAPI函数:SuspendThread和ResumeThread内核函数:PsSuspendThread和PsResumeThread挂起线程的源代码LIST_ENTRYSuspendListHead={&SuspendListHead,&SuspendListHead};STATUSPsSuspendThread(INHANDLEhThread){ STATUSStatus; BOOLIntState; PTHREADThread; Status=ObRefObjectByHandle(hThread,PspThreadType,(PVOID*)&Thread); if(EOS_SUCCESS(Status)){ IntState=KeEnableInterrupts(FALSE); //关中断

if(Ready==Thread->State){ PspUnreadyThread(Thread); ListInsertTail(&SuspendListHead,&Thread->StateListEntry); Status=STATUS_SUCCESS; }else{ Status=STATUS_NOT_SUPPORTED; } KeEnableInterrupts(IntState); //开中断

ObDerefObject(Thread); } returnStatus;}恢复线程的源代码STATUSPsResumThread(INHANDLEhThread){ STATUSStatus; BOOLIntState; PTHREADThread; Status=ObRefObjectByHandle(hThread,PspThreadType,(PVOID*)&Thread); if(EOS_SUCCESS(Status)){ IntState=KeEnableInterrupts(FALSE); //关中断

if(Zero==Thread->State){

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论