WIN32多线程程序设计学习笔记(第四章 下 第五章)

原创 2004年05月07日 13:29:00

WIN32多线程程序设计学习笔记(第四章 下 第五章)

 

终于又看<<WIN32多线程程序设计>>了;开卷有益,今天看了第四章后半部分,感觉颇有收获;以前对EVENT这个核心对象,用起来总是心中没底,看了EVENT的介绍也是似懂非懂的。哈!今天看了以后,真有神助,我觉得应该是搞懂了(自以为事J)。仔细想想,应该是记笔记的功劳,用脑筋写过的东西还真是不容易忘记咧!!!不但印象深刻,而且助我理解了EVENT

 

好了,闲话少说,进入正题吧!

从第三章以来,每一章都必不可少的用到了一个重要的函数,知道是什么吗?

――――WaitFor…. ()系列

//快速复习

判断一个线程是否结束:WaitForSingleObject ( HANDLE hthred …. );

判断是否能够进入关键区域WaitForSingleObject ( hMutex….) ;

 

Wait….()会在核心对象被激发时返回,各种核心对象对激发的定义不甚相同,对于hthred而言,线程结束,意味着核心对象被激发;对于hMutex而言, hMutex不再被其它任何线程使用,意味着核心对象被激发。反正对于各种核心对象而言,一定是有某种场景的出现使得核心对象被激发,除了EVENT这个核心对象。

 

对于EVENT这个核心对象而言,它的激发状态完全由程序来控制,也就是说,由自己来控制EVENT的激发或未激发状态( 通过SetEvent() , ResetEvent() )。当线程1调用Wait…(hEvent)而被阻塞后,一定是某个线程调用了SetEvent( hEvent )使hEvent被设为激发状态,从而使线程1被解除阻塞继续向下运行,具体的运用参见下表:

 

函数

EVENT对象[Manual方式产生]

EVENT对象[Auto方式产生]

Wait…()

EVENT对象变为激发状态(使得因调用Wait…()而等待的线程被唤醒)之后,不会被重置为非激发状态(必须调用ResetEvent())

EVENT对象变为激发状态(使得因调用Wait…()而等待的线程被唤醒)之后,自动重置为非激发状态

SetEvent()

EVENT对象设为激发状态

EVENT对象设为激发状态

ResetEvent()

EVENT对象设为非激发状态

EVENT对象设为非激发状态

PulseEvent()

EVENT对象设为激发状态,唤醒“所有”等待中的线程,然后把EVENT对象设为非激发状态

EVENT对象设为激发状态,唤醒“一个”等待中的线程,然后把EVENT对象设为非激发状态

[使用CreateEvent () API函数构造EVENT核心对象CreateEvent ()的第二个参数决定了产生的EVENT对象是Manual(手工)方式还是Auto(自动)方式;第三个参数决定了决定了产生的EVENT对象初始状态是激发还是未激发]

 

EVENT核心对象的不同的状态(初始状态是激发还是未激发)及不同的类型(Manual[手工]方式还是Auto[自动]),与之对应的处理方式也就不一样,情况太多了真是不好一一举例,以后补上J(在下面第五章中,我举了一个例子)

 

值得注意:使用PulseEvent()方法激发EVENT的请求可能会被遗失,由此可能产生的一系列问题在P124有很精彩的描述,值得一看(由此描述引出了semaphore同步机制)。

 

至此,第四章差不多可以结束了(除了semaphore,Interlocked ,自己看一下吧!)

 

下面进入第五章:

 

如何强制结束一个线程?查查有关线程的API函数,立刻便找到一个结束线程的函数―――――TerminateThread ( ) ; 用它吗?

噢!不要使用它。被TerminateThread ( )强制结束的线程可能会有造成以下后果:

1、  没有机会在自己结束前释放自己所使用的资源

2、  可能引起内存泄漏

3、  如果这个线程被结束时处于一个critical section之中,那么该critical section将因此永远处于锁定状态。

 

那么如何强制结束一个线程?书上给出了一个例子,以后强制结束一个线程就靠它了。

程序片段:

//线程退出事件

HANDLE hExitEvent = null ;

//一个需要长时间运行的线程

DWORD WINAPI ThreadFun ( LPVOID p )

{

       for (  int I =0 ; I < 1000000; I++ )

       {

       //判断线程是否要被强制结束

/*  可能在这里大家有点疑惑 ,如果没有调用SetEvent()的方法,

hExitEvent不是总处于未激发状态吗?哪线程不就停在这里不动了?

答案是:这里用到了P74提到的一个Wait….()一个用法,当time_out

0,检查hExitEvent的状态,如果hExitEvent处于未激发状态,

立刻返回WAIT_TIMEOUT,如果hExitEvent处于激发状态,则立刻

返回WAIT_OBJECT_0*/

if ( WaitForSingleObject ( hExitEvent , 0 ) !=WAIT_TIMEOUT )

{

       //做一些退出线程前的清理工作

       return (DWORD) –1 ;

}

              //做一些极其消耗时间的处理….

              //…….

              //……..

       }

}

void main()

{            

              HANDLE hThrd;

//构造EVENT核心对象,初始状态处于未激发状态,Manual方式

              hExitEvent = CreateEvent ( NULL,TRUE,FALSE,NULL ) ;

//线程启动

              hThrd  = CreateThread ( null,ThreadFun,…..);

              //等待了很久,实在等不下去了,发出结束线程退出事件(激发EVENT核心对象)

              //迫使线程结束

              SetEvent ( hExitEvent ) ;

       //等待线程结束

       WaitForSingleObject (hThrd,… );

       CloseHandle ( hThrd );

}

 

下面接着谈到了线程的优先权,调整线程优先权很简单,无非就是用SetThreadPriority()GetThreadPriority()等函数。但如何有效,合理的调整线程的优先权却是一个复杂的问题,正如书上所说,“如果你的目标是保持简单,那就还是避免处理[优先权]这个烫山芋吧“。

 

 

 

 

附注:以上正文纯属加强记忆所做笔记,内容或有不详,甚至错误,请阅者见谅,匆见怪!!!

 

 

      

 

Win32多线程程序设计

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

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

前面章节介绍了线程创建等过程,现在的问题是:如何在某个线程内终止另外一个正在运行的线程? windows核心编程中提到终止运行线程的方法:        1)线程函数自己返回;     ...
  • qq819853294
  • qq819853294
  • 2013年09月15日 17:13
  • 848

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

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

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

前面已经介绍了线程的创建、销毁过程,如何判断一个线程是否结束;但是撰写多线程程序的一个挑战性问题就是:如何让一个线程和另外一个线程合作。         在同一时间段会存在多个线程,当这些线程同时存取...
  • qq819853294
  • qq819853294
  • 2013年09月14日 11:16
  • 938

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

上一笔记讲了同步机制中的临界区域(Critical Sections)、互斥器(Mutexes),下面介绍同步机制中的另外两种。 信号量(Semaphores) 举个例子:   ...
  • qq819853294
  • qq819853294
  • 2013年09月14日 15:34
  • 660

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

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

个人笔记--JavaScript高级程序设计(第三版)--第五章

第五章 引用类型 Object类型 Array类型 Date类型 RegExp类型 Function类型 基本包装类型 单体内置对象 小结...
  • wx11408115
  • wx11408115
  • 2016年07月25日 20:03
  • 549

Java语言程序设计(基础篇)原书第十版 课后习题 第五章

import java.util.Scanner; public class Code_Practice_5 { public static void main(String[] args) {...
  • zjjoebloggs
  • zjjoebloggs
  • 2015年10月21日 20:27
  • 9942

Java语言程序设计基础篇原书第十版第五章综合题答案

循环的综合题。需要其它讲解的话,评论中留下题号。
  • Tanganling
  • Tanganling
  • 2016年11月13日 13:01
  • 3723

java语言程序设计基础篇第四章编程练习题

1 import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner i...
  • gyhguoge01234
  • gyhguoge01234
  • 2016年07月03日 11:59
  • 1947
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WIN32多线程程序设计学习笔记(第四章 下 第五章)
举报原因:
原因补充:

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