WIN32多线程二 用WaitXXX函数等待线程结束(转)
2011-04-27 23:38
369 查看
等待线程结束的更好方法是调用API WaitForSigleObject和WaitForMultipleObjects。前者用于等待一个线程由未激发状态变为激发状态,后者用于等待多个线程中全部或多个中的一个由未激发状态变为激发状态。对线程内核对象而言,如果线程在运行,则是未激发状态;如果线程已经退出,则是激发状态。不同内核对象的激发、未激发状态含义有所不同。
DWORD WINAPI WaitForSingleObject(
__in HANDLE hHandle, //等待的内核对象句柄
__in DWORD dwMilliseconds //等待的超时时间
);
函数失败,返回WAIT_FAILED;
等待对象变为激发状态,返回WAIT_OBJECT_O;
等待超时,返回WAIT_TIMEOUT;
一个拥有mutex的线程结束前,没有释放掉mutex,则返回WAIT_ABANDONED.
DWORD WINAPI WaitForMultipleObjects(
__in DWORD nCount, //等待内核对象个数
__in const HANDLE* lpHandles,//内核对象数组
__in BOOL bWaitAll, //是否等待所有内核对象,还是等待其中一个变为激发状态就返回
__in DWORD dwMilliseconds //等待的超时时间
);
函数失败,返回WAIT_FAILED;
等待超时,返回WAIT_TIMEOUT;
bWaitAll为TRUE,所有对象变为激发状态,返回WAIT_OBJECT_O;
bWaitAll为FALSE,返回值减去WAIT_OBJECT_O的值就是变为激发状态内核对象在数组中的索引;
如果内核对象中有mutex,返回值可能在WAIT_ABANDONED到WAIT_ABANDONED+nCount-1。
下面是个<<WIN32多线程程序设计>>中用WaitForMultipleObjects实现的简单的线程池的例子,3个线程来完成6个任务。
DWORD WINAPI WaitForSingleObject(
__in HANDLE hHandle, //等待的内核对象句柄
__in DWORD dwMilliseconds //等待的超时时间
);
函数失败,返回WAIT_FAILED;
等待对象变为激发状态,返回WAIT_OBJECT_O;
等待超时,返回WAIT_TIMEOUT;
一个拥有mutex的线程结束前,没有释放掉mutex,则返回WAIT_ABANDONED.
DWORD WINAPI WaitForMultipleObjects(
__in DWORD nCount, //等待内核对象个数
__in const HANDLE* lpHandles,//内核对象数组
__in BOOL bWaitAll, //是否等待所有内核对象,还是等待其中一个变为激发状态就返回
__in DWORD dwMilliseconds //等待的超时时间
);
函数失败,返回WAIT_FAILED;
等待超时,返回WAIT_TIMEOUT;
bWaitAll为TRUE,所有对象变为激发状态,返回WAIT_OBJECT_O;
bWaitAll为FALSE,返回值减去WAIT_OBJECT_O的值就是变为激发状态内核对象在数组中的索引;
如果内核对象中有mutex,返回值可能在WAIT_ABANDONED到WAIT_ABANDONED+nCount-1。
下面是个<<WIN32多线程程序设计>>中用WaitForMultipleObjects实现的简单的线程池的例子,3个线程来完成6个任务。
相关文章推荐
- WIN32多线程二 用WaitXXX函数等待线程结束
- 网络编程(35)—— 利用pthread_join函数等待线程结束并获取线程函数返回值
- c++11线程管理,RAII方式等待异常环境下线程结束
- Delphi写的等待进程运行结束函数
- QT5删除隐藏目录+隐藏文件(使用Process::start函数调用系统命令,且等待到结束)
- 主线程中使用join等待所有子线程执行结束
- java中对线程的实现 等待多个子线程结束 多个子线程运行中进行同步
- 【经典转载】Linux进程学习系列之五 等待进程结束wait()和waitpid()函数
- [原] 主线程等待子线程结束(多线程结束标识)
- Delphi 如何解决在DLL的入口函数中创建或结束线程时卡死
- 应用select 函数控制多线程中子线程结束方法
- 管理线程之等待线程结束
- 函数: waitpid - 等待子进程中断或结束
- 函数: waitpid - 等待子进程中断或结束
- 理解 Thread.Sleep 函数 ,Sleep(0) 释放当前线程所剩余的时间片,让线程马上回到就绪队列而非等待队列
- 利用ThreadGroup等待所有线程执行结束
- Qt线程QThread简析(8个线程等级,在UI线程里可调用thread->wait()等待线程结束,exit()可直接退出线程,setStackSize设置线程堆栈,首次见到Qt::HANDLE,QThreadData和QThreadPrivate)
- 编写多线程代码时,启动线程后等待线程结束方法
- VC++等待线程结束的方法
- 多线程同步执行函数,超时后结束掉线程