您的位置:首页 >> 编程开发 >> Visual C++ >> 进程和线程 >> 正文
进程和线程 RSS
 

WIN32多线程程序设计学习笔记(第三章)

http://www.rdxx.com 06年12月12日 20:22 Blog 我要投稿

WIN32多线程程序设计学习笔记(第三章)

 

通过在上一章的学习,我学会使用GetExitCodeThread()这个函数来判断一个线程是否还在执行。通过这个函数,我就可以对付“某个线程必须在某个线程结束后才能运行”的情况。复习一下:

程序片段:

              for  ( ; ; )

              {

                     int rc;

                     rc  =  GetExitCodeThread(hThrd,&exitCode);

                     if (!rc && exitCode != STILL_ACTIVE)

                            break;

              }

使用这个方法,必须持续不断的调用GetExitCodeThread(),直到其结果不再是STILL_ACTIVE书上说这方法不好,很浪费cpu时间.,称为忙等待(busy waits)忙等待必须应有的重视,不然你会发现当包含忙等待的程序运行起来后,其它正在进行的程序的反应就很迟钝了。因为cpu几乎用了所有的可用时间去检查线程是否结束。

 

那么,我应该怎么做呢?如何才更有效率呢?

 

另一种有效率的方法:

使用WaitForSingleObject()这个函数来完美的解决问题。

完成上面程序片段同样功能只需一句话:

WaitForSingleObject ( hThrd, INFINITE );

hThrd线程没有结束时,调用这个函数的程序就会在函数调用点停下来,直到hThrd线程结束时(术语:hThrd被激发)才继续向下执行。

不知道大家会不会有这样疑问------这个函数不会只是把上面的程序片段包装了一下吧?它真是很有效率吗?如果它有效率,它是如何做到的呢?

可以告诉大家,WaitForSingleObject()不是上述程序片段的简单包装,它真的很有效率(不信,按书上的方法,打开性能管理器看看),至于它如何做到的,我也有兴趣知道(知道告诉我),我只知道这个函数得到了操作系统级的某些底层调度函数的支持。

 

基本上本章的核心内容就是以上所述了。(至于WaitForSingleObject()参数及返回值的说明,查书就行了,毋需多言)

 

 

具体的看一个实在的例子,胜过在此长篇大论,下面请看:

//参考书上例子

//程序的目的:只用3个线程,完成6件事

int main()

{

              HANDLE        hThrds[3];

 

              int slot = 0;

              For ( int I=1 ; I<=6 ; I++)

              {

                     if( I > 3 )

                     {//已经存在3个线程了

9 7 3 1 2 4 8 :


 
 
标签: 学习笔记 , 多线程 , 程序设计 , Win32 , 学习 , 程序 , 设计 , 线程 打印本文
 
 
  热点搜索
 
 
 



Valid XHTML 1.0 Transitional
Copyright ©2005 - 2008 Rdxx.Com,All Rights Reserved
收藏本页
收藏本站