我实际搜索的是 .net ThreadState Enumeration的 c++/win32 等效项。
有什么建议么?
我实际搜索的是 .net ThreadState Enumeration的 c++/win32 等效项。
有什么建议么?
这些之间几乎没有什么区别,都是等待不同的内核对象。
“等待”我假设您的意思是“I/O 等待”。“加入”只是“等待一个线程/进程”。而“睡眠”是“等待计时器”。
更复杂的是,线程可能正在等待内核对象的某种组合。
您可以使用内核调试器找出线程正在等待的对象以及这些对象的类型。我认为没有更简单的方法。
没有直接的等价物 - 托管和非托管线程不应被视为相同。见这里。
操作系统 ThreadId 与托管线程没有固定关系,因为非托管主机可以控制托管线程和非托管线程之间的关系。具体来说,复杂的主机可以使用 Fiber API 针对同一个操作系统线程调度许多托管线程,或者在不同操作系统线程之间移动托管线程。
使用 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;
}
“问题”是 .NET 运行时拥有您的 .NET 线程的所有权。因此,例如,当您调用 Abort 时,运行时内部会在 .NET 线程的 .NET 上下文中引发 ThreadAbortException 异常,这就是您可以使用 catch(ThreadAbortException) 在线程中捕获它的方式。
ThreadState 也是如此,因为它拥有线程的底层所有权,它确切地知道它在做什么,因此可以产生一个有效的线程状态。
由于没有非黑客方法可以正式查询线程的内部状态,因此您可以将其包装在一个类中。但同样,您将完全依赖线程方法来遵守任何 .Abort() 请求。