如何确定win32线程在c ++中处于Wait或Join或Sleep状态

时间:2011-11-18 16:15:17

标签: c++ multithreading winapi thread-state

我实际搜索的是.net ThreadState Enumeration等效的c ++ / win32。

有什么建议吗?

4 个答案:

答案 0 :(得分:3)

这些之间差别很小,都在等待不同的内核对象。

通过“等待”我假设你的意思是“I / O等待”。 “加入”只是“等待线程/进程”。 而“睡眠”就是“等待计时器”。

更复杂的是,线程可以等待某些内核对象的组合。

您可以使用内核调试器找出线程正在等待的对象以及这些对象的类型。我认为没有更简单的方法。

答案 1 :(得分:2)

没有直接的等价物 - 托管和非托管线程不应该被认为是相同的。请参阅here

  

操作系统ThreadId与托管没有固定的关系   线程,因为非托管主机可以控制之间的关系   托管和非托管线程。具体而言,复杂的主机可以   使用Fiber API根据相同的方式安排许多托管线程   操作系统线程,或移动不同的托管线程   操作系统线程。

答案 2 :(得分:1)

使用winapi可以轻松访问本机线程的唯一状态是知道线程是否已完成执行。只需将函数WaitForSingleObject()与线程句柄一起使用,超时为0:

DWORD res = WaitForSingleObject(handleThread, 0);
switch (res)
{
    case WAIT_OBJECT_0:
        printf("The thread has finished\n");
        break;
    case WAIT_TIMEOUT:
        printf("The thread is still running\n");
        break;
    default:
        printf("Unknown error (shouldn't happen)\n");
        break;

}

答案 3 :(得分:1)

“问题”是.NET运行时拥有.NET线程的所有权。因此,当您调用Abort时,运行时内部会在.NET线程的.NET上下文中引发ThreadAbortException异常,这就是您可以使用catch(ThreadAbortException)在线程中捕获它的方法。

ThreadState也是如此,因为它具有你线程的基础所有权,它确切知道它在做什么,因此可以产生一个有效的线程状态。

由于没有非hackins方式正式查询线程的内部状态,你可以将它包装在一个类中。但同样,你完全依赖于线程方法来遵守任何.Abort() - 请求。