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

原创 2007年09月17日 20:05:00
通过在上一章的学习,我学会使用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个线程了
//等待其中的一个线程线束后,再创建线程做剩余的事情
//效率不高,因为线程结束的次序与它们被产生的次序不同
WaitForSingleObject( hThrds[slot] , INFINITE ) ;
CloseHandle ( hThrds[slot] );
                     }
 
                     //构造线程
                     hThrds[slot] = CreateThread(NULL,0,ThreadFunc,NULL,0,NULL);
                    
                     if (++slot>2)
                            slot=0;
}// end for
 
for ( slot=0; slot<3; slot++)
{
       //等待剩余的线程结束
       WaitForSingleObject( hThrds[slot] , INFINITE ) ;
       CloseHandle ( hThrds[slot] );
}// end for
}
 
上面的这段程序有一个问题,就是效率不是很高;理想的状况是,一旦有一个线程结束,就立刻产生一个线程补上。仔细读上面的程序,你会发现它无法实现理想的状况;因为它假设线程结束的次序会和它们被产生的次序相同。比如,当依序产生了1,2,3线程以后,一定是按1,2,3的次序结束。其实不然,也许2比1更早结束。在这时,上面的程序并不会立刻产生一个线程填补2,而是非要等1结束了,才产生线程。那么能够实现理想的状况吗?答案是可以,请用WaitForMultipleObjects() 函数, 这个函数的用法基本上与WaitForSingleObject()差不多,在这里我就不举例说明了。
 
本章最后还提到了MsgWaitForMultipleObjects() , 这个函数特点是在消息到达或线程结束时返回。
 
我想,只要用会了WaitForSingleObject()这个函数, 那么WaitForMultipleObjects()MsgWaitForMultipleObjects()看一下也就会用了(书上举了两个小例子来说明,看一下花不了多少时间,不必我在这里废话了)。
 
这一章节的内容大概就是这么多,总结一下:
* 等待线程结束                  [ WaitForSingleObject()         ]
* 等待多个线程结束              [ WaitForMultipleObjects()               ]
* 等待多个线程结束或消息到达    [ MsgWaitForMultipleObjects()        ]
 

Win32多线程程序设计

Win32多线程程序设计”多线程多任务“是程序开发者和用户都需要的一个重要资产。从WindowsNT开始,完全支持32位程序的抢占式多任务。带领我们进入了”多线程多任务“时代。基本概念 进程(pro...
  • chenjintaoxp
  • chenjintaoxp
  • 2015年07月31日 16:04
  • 1200

win32多线程程序设计笔记(第三章)

一、复习第二章 在第二章中,讲到了两种等待线程的技术:         1)使用Sleep()函数——问题是你不可能事先知道什么事情要等待多久         2)使用busy loop,通过不断...
  • qq819853294
  • qq819853294
  • 2013年09月10日 19:19
  • 814

深入浅出Win32多线程程序设计

引言   从单进程单线程到多进程多线程是操作系统发展的一种必然趋势,当年的DOS系统属于单任务操作系统,最优秀的程序员也只能通过驻留内存的方式实现所谓的"多任务",而如今的Win32操作系统却可...
  • Qsir
  • Qsir
  • 2017年05月17日 15:09
  • 221

《Win32多线程程序设计》(10)---如何终止一个线程

结束一个线程,听起来好容易,但是结束程序必须按次序进行,以避免发生race  conditions。让程序依次序进行是非常重要的,特别是在程序要结束之前。结束一个程序就好像拆除一栋建筑物一样,在你以推...
  • LeeLaoHan
  • LeeLaoHan
  • 2014年02月12日 10:27
  • 537

【笔记】Linux驱动学习第三章

作者:Exculivor 日期:2015年06月29日前面我们学习了如何写简单的驱动以及简单的测试软件。 今天我们来正式的写一个能够使用的简单驱动以及对应的测试软件。 注:目标平台为RT5350...
  • chuangjianNDSC
  • chuangjianNDSC
  • 2015年06月29日 08:25
  • 895

Android开发艺术探索笔记 第三章

Android开发艺术探索笔记 第三章View事件体系 view的位置有四个定点来决定,这些坐标都是相对于view的父容器来说的 左上角是left和top右下角是right和bottom getx、y...
  • qq_18228883
  • qq_18228883
  • 2016年08月22日 23:59
  • 166

周志华《机器学习》笔记:第3章 线性模型

本章概括 从最简单但也是最基础的线性模型开始研究。线性模型虽然简单,但却是基础。先研究线性、单属性的线性回归问题,在此基础上研究非线性、多属性的回归和分类问题。 第3章 线性模型 单属性...
  • yzqzoom
  • yzqzoom
  • 2016年07月10日 12:11
  • 3139

Win32多线程编程学习心得

博客原文地址:http://jerkwisdom.github.io/study/thread/thread-Summary/ 此处博客不再更新。 为什么多线程? 其实不想写这一点,多线程并不一定...
  • jonathan321
  • jonathan321
  • 2016年03月02日 20:26
  • 1547

Linux程序设计-读书笔记1

chap 1 1.链接库分为静态链接库.a和共享库.so。 2.静态链接库示例: hello.c ---------------------------------------- #incl...
  • conanswp
  • conanswp
  • 2015年09月01日 22:04
  • 804

Linux程序设计学习笔记----多线程编程基础概念与基本操作

转载请注明出处,谢谢.
  • hu1020935219
  • hu1020935219
  • 2014年08月14日 14:22
  • 1891
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WIN32多线程程序设计学习笔记(第三章)
举报原因:
原因补充:

(最多只允许输入30个字)