概述
注意
实际上这个本身是一种不是完全靠谱的做法。 因为线程id是可以被重复分配的,因此真正想判断的线程可能已经死了,但是如果该线程id被分配给新的线程,会误判为该线程仍然存活。
使用场景
目前个人把它用在进程退出、对象析构这类场景中。
比如线程池的析构要等待所有线程的当前任务执行完毕,先析构所有线程。
此时如果某个线程已经被杀了,那么可能永远误判该线程的任务没有执行完成,造成析构卡死,进而导致进程退出卡死的问题。
用法
#include "processthreadsapi.h"
/* API 定义
获得一个线程的返回码。
1. 如果该线程仍然或者,lpExitCode返回STILL_ALIVE
2. 如果该线程已经退出(不管是强杀还是正常、异常退出),lpExitCode返回它退出时的返回码
WINBASEAPI _Success_(return != 0) BOOL WINAPI GetExitCodeThread(_In_ HANDLE hThread, _Out_ LPDWORD lpExitCode);
*/
/* 示例:持有一个thread对象的句柄, 判断它是否仍然存活 */
bool IsThreadAlive(thread& th) {
DWORD exitCode;
bool ret = ::GetExitCodeThread(th.native_handle(), &exitCode);
if (!ret) {
return true; // 得不到当前错误码,仍然认为该线程活着
}
if (exitCode != STILL_ACTIVE) {
return false;
}
return true;
}