线程的快跑与等待

  最近重新看侯捷的《win32多线程程序设计》,今天看到了第三章的“快跑与等待”,感觉现在理解起来不像刚开始看那么难了,今天就回顾一下这一章的一些重要知识点。

  1.这一章一开始就提醒我们“绝对不要在win32中使用busy loop”,什么叫“busy loop”呢?其实很简单,比如一个判断线程是否结束的程序(如下程序)。

               for (;;)
               {
                  GetExitCodeThread(hThrd, &exitCode);
                  if ( exitCode != STILL_ACTIVE )
                  break;
               }
   为什么不要使用一个“busy loop”呢?因为它耗费了我们太多的时间来判断线程是否结束。

 2.其次本章提到了windows使用的一些工具来监测cpu的工作状态。windowsNT下的性能监视器,windows95下的系统监视器。windows95的系统监视器只能显示cpu的整体使用率,不能显示个别线程的cpu使用率。而windowsNT的性能监视器则相对来说功能更全面,它能够提供我们观察单独的线程的所使用的cpu时间。

 3.等待一个线程,win32提供了一个名为  WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds)   可以用来等待一个线程的完成,其实这个函数还可以等待其它核心对象的激发。如果该函数失败,则其返回值为WAIT_FAILED.若等待的对象变成激发状态,则返回WAIT_OBJECT_0.若是核心对象激发之前,等待时间终了,则返回WAIT_TIMEOUT.对于这个时间参数,可以设置为INFINITE,这样,函数会等到核心对象变成激发状态才返回,否则,该函数会一直处于等待状态。当将该时间参数设为0时,我们可以获取该核心对象的当前状态(激发或未激发)。

 4.本章还列举了核心对象的激发状态与未激发状态的含义。举个例子,比如线程核心对象,当线程还在执行时,线程核心对象处于未激发状态,当线程结束时,线程核心对象则处于激发状态。

 5.等待多个对象可以用到WaitForMultipleObjects(DWORD ncount,CONST HANDLE* lpHandle,BOOL fWaitAll,DWORD dwMilliseconds); 其中二个参数是一个核心对象的句柄的数组,第一个是数组中句柄数,第三个参数为TRUE时,表示要等待所有的核心对象都变成激发状态,为FALSE表示只要有一个核心对象被激发,则函数立即返回。返回值:如果fWaitAll为TRUE,返回值为WAIT_OBJECT_0,如果为FALSE,则返回值减去WAIT_OBJECT_0即为被激发的对象在数组中的索引。

 6.关于最后一个GUI线程的等待,用到了MsgWaitForMultipleObjects,它只增加了一个参数,用来观察用户输入的消息。它同时等待线程核心对象和消息。一旦有对象激发或接收到消息就返回。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值