reactos操作系统实现(41)

来源:互联网 发布:mysql修改数据库密码 编辑:程序博客网 时间:2024/05/06 14:30

当线程初始化成功后,是怎么样放到推迟就绪队列的呢?通过下面这几个函数的分析,就会了解这个问题了。从以前的分析可以知道是调用函数KeReadyThread来执行的,这个函数的代码如下:

#001  VOID

#002  NTAPI

#003  KeReadyThread(IN PKTHREAD Thread)

#004  {

这里参数Thread就是刚刚创建的线程。

 

#005      KIRQL OldIrql;

#006      ASSERT_THREAD(Thread);

#007     ASSERT_IRQL_LESS_OR_EQUAL(DISPATCH_LEVEL);

#008 

 

锁住分发器的自旋锁,以便原子操作。

#009      /* Lock the Dispatcher Database */

#010      OldIrql = KiAcquireDispatcherLock();

#011 

 

设置线程为就绪状态。

#012      /* Make the thread ready */

#013      KiReadyThread(Thread);

#014 

 

释放分发器的自旋锁。

#015      /* Unlock dispatcher database */

#016      KiReleaseDispatcherLock(OldIrql);

#017  }

 

在这个函数里主要就是同步了分发器的自旋锁,然后用调函数KiReadyThread来进一步设置线程就绪状态。