您的位置:首页 > 移动开发 > Objective-C

WaitForSingleObject()函数,其第一个参数是一个核心对象(如线程)的 handle

2013-04-29 14:49 337 查看
Win32 提供WaitForSingleObject()函数,其第一个参数是一个核心对象(如线程)的 handle。为方便讨论,把等待线程称为线程#1,把被等待线程称为线程#2。
调用 WaitForSingleObject()并放置一个“线程句柄”作为参数,将使线程#1开始睡眠,直到线程#2结束。像Sleep()函数一样,WaitForSingleObject()也有一个参数用来指定最长的等待时间。
DWORD WaitForSingleObject(
HANDLE hHandle, DWORD dwMilliseconds);
hHandle:等待对象的 handle(代表一个核心对象)。
dwMilliseconds:等待的最长时间。时间终了,即使 handle尚未成为激发状态,此函数也要返回。此值可以是0(代表立刻返回),也可以是 INFINITE代表无穷等待。
如果函数失败,返回WAIT_FAILED。这时可调用 GetLastError()取得更多信息。
此函数的成功有三个因素:
1. 等待的目标(核心对象)变成激发状态。返回值为WAIT_OBJECT_0。
2. 核心对象变成激发状态之前,等待时间终了。返回值为WAIT_TIMEOUT。
3. 如果一个拥有mutex(互斥器)的线程结束前没有释放mutex,则传回 WAIT_ABANDONED。(abandoned:废弃)
获得一个线程对象的 handle之后,WaitForSingleObject()要求操作系统让线程 #1 睡眠,直到以下任何一种情况发生:
1. 线程#2结束
2. dwMilliseconds时间终了。该值系从函数调用后开始计算。
由于操作系统持续追踪线程#2,即使线程#2 失事或被强迫结束,WaitForSingleObject()仍然能够正常运作。
如果想一直等待某个线程,直到线程退出,可以用如下代码:
WaitForSingleObject( hThrd, INFINITE );
关于time-out,有一个特别重要的用途,但很少被人注意。设定time-out为0,能够检查handle的状态并立刻返回,没有片刻停留。如果handle已经备妥,那么这个函数会成功并传回 WAIT_OBJECT_0。否则,这个函数立刻返回并传回 WAIT_TIMEOUT。
另外可以利用 time-out提供一个动画,表示正在等待某个线程的结束。可以每 500毫秒就time-out一次,更新图示,然后再继续等待。
WaitForSingleObject()可以面对许多种 handles工作,不一定非要是的线程 handle。事实上,Win32中大部分以HANDLE表示的对象都能够作为 WaitForSingleObject()的等待目标。视所拥有的对象不同,操作系统等待的事情也不一样。形式上来说,系统等待着这一对象“被激发”。
【学习资料】 《Win32多线程程序设计》

关于线程与线程句柄
主线程只要拥有线程句柄,事后就可以对线程执行某些操作,比如查询线程状态等等,靠的就是句柄,如果没有句柄,系统就无从知道要查的是那个线程的状态。但保持这个句柄不关闭,并不是线程运行的条件。
关闭线程句柄只是释放句柄资源,新开启线程后,如果不再利用其句柄,应该关闭句柄,释放系统资源。关闭线程句柄和线程的结束与否没有关系。
句柄可以认为是系统对资源(如线程)的分配的一个编号。关闭这个编号,对于不同的资源,效果不尽相同。对于线程来说,关闭这个编号并不意味着终止线程,只是之后很难再操纵这个线程。 这就好比摘掉了门牌号,并不伤害这一家人,只是以后往这送信就麻烦些了。 还有,如果主线程只想创建线程,而并不想之后再查询或操纵它,那么及时关闭句柄是个好习惯,免得当时没关,以后又忘了,于是泄漏了系统的句柄资源(系统句柄总数是有限的)。
如果知道引用计数是怎么回事就很好解释了。 CloseHandle(hThread) 只是减去一个hThread的引用计数。
线程句柄就像你家的地址,线程就像你的家房子, 你说如果没有了你家的地址,难道就没有你家的房子了吗? 线程与线程句柄也是一样的道理,句柄只是可以对这个线程作一些操作。
CloseHandle是关闭线程句柄,用来释放线程资源的,不是终止线程的.线程的终止用terminatethread或exitthread,TerminateThread的使用会导致各类资源释放问题,主要是与该线程相连的各类dll,他们无法得到线程退出的通知。应该在线程中自然退出(即隐式调用ExitThread)或直接显式调用ExitThread。退出的时机应由同步对象或其他机制来实现,而且主线程一般应使用WaitForSingleObject函数等待该线程的句柄,以确保线程的退出。 希望对你有帮助
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: