【windows + 线程】 根据线程句柄/id判断线程是否已经被杀死

概述

注意

实际上这个本身是一种不是完全靠谱的做法。 因为线程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;
}

参考

https://stackoverflow.com/questions/8126877/given-a-thread-id-how-to-decide-its-still-running-or-not-on-windows

posted @ 2020-10-09 22:37  mooooonlight  阅读(944)  评论(0编辑  收藏  举报