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

原创 2007年09月17日 20:09:00
终于又看<<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多线程程序设计》学习笔记二

一、产生一个线程 1、产生一个线程(并因而成就一个多线程程序),是以CreateThread()函数作为开始。此函数原型如下: 二、使用多线程的结果 1、多线程程序无法预...

《win32多线程程序设计》学习笔记四

一、Critical Sections

转载:《Win32多线程程序设计》学习笔记 第10章 MFC 中的线程

《Win32多线程程序设计》学习笔记 第10章 MFC 中的线程 如果要在MFC程序中产生一个线程,而该线程将调用MFC函数或者使用MFC的任何数据,那么你必须以AfxBeginThre...

《Win32多线程程序设计》读书笔记(一)

1,可以使用GetExitThreadCode函数获取线程函数结束时的返回值 2,多线程程序设计成功的关键: 2.1,各线程的数据要分离开来,避免使用全局变量 2.2,不要在线程之间共享GDI对象 2...

《Win32多线程程序设计》读书笔记之内核对象

所谓句柄(Handle),其实就是指针,指向操作系统内存空间中的某样东西,为了维护系统的完整性与安全性,不允许直接取得。 内核对象与GDI对象不同,内核对象由KERNEL32.DLL管理,而GD...

win 32多线程程序设计读书笔记

一直不是很熟悉windows下的编程,借着学习侯捷老师翻译的《win32 多线程程序设计》来完成操作系统的作业。 1.今天学到的比较重要的概念是核心对象(一下大部分话出自该书): 核心对象可以有...

《Win32多线程程序设计》(3)---同步控制

让我先对同步(synchronous)与异步(asynchronous)做个说明。当程序1调 用程序2时,程序1停下不动,直到程序2完成回到程序1来,程序1才继 续下去,这就是所谓的“synchron...

《Win32多线程程序设计》(14)---操作I/O Completion Port

操作概观 1. 产生一个 I/O completion port。 2. 让它和一个文件handle 产生关联。 3. 产生一堆线程。 4. 让每一个线程都在com pletion port 上等待。...

深入浅出Win32多线程程序设计之二:线程控制

深入浅出Win32多线程程序设计之线程控制   WIN32线程控制主要实现线程的创建、终止、挂起和恢复等操作,这些操作都依赖于WIN32提供的一组API和具体编译器的C运行时库函数。  1.线程函...

深入浅出Win32多线程程序设计之三:线程通信

深入浅出Win32多线程程序设计之线程通信 简介  线程之间通信的两个基本问题是互斥和同步。  线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WIN32多线程程序设计学习笔记(第四章 下 第五章)
举报原因:
原因补充:

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