当线程初始化成功后,是怎么样放到推迟就绪队列的呢?通过下面这几个函数的分析,就会了解这个问题了。从以前的分析可以知道是调用函数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 }