【问题标题】:How to determine that a win32 thread is either in Wait or Join or Sleep state in c++如何在c ++中确定win32线程处于Wait或Join或Sleep状态
【发布时间】:2011-11-18 16:15:17
【问题描述】:

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

有什么建议吗?

【问题讨论】:

  • NtQuerySystemInformation() 但没有记录。唯一记录的方式是带有 Win32_Thread 类的 WMI。
  • 谢谢大家的回答我真的很感谢你的努力!!!但是,我正在寻找类似 BOOL IsThreadInWaitJoinSleep(HANDLE threadHandle) 的东西?还有其他建议吗?
  • 你无法理解。同样的原因,您无法在不实际尝试打开文件的情况下发现文件已被锁定。因为这样的操作在多任务操作系统上是完全无法使用的。一纳秒后,文件可能被锁定。否则线程可能会被阻塞。
  • @Hans Passant:那我怎么能得到这个 .net 线程的信息呢?
  • 你不能,没有办法将 ProcessThread 映射到 Thread。仅供参考。

标签: c++ multithreading winapi thread-state


【解决方案1】:

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

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

更复杂的是,线程可能正在等待内核对象的某种组合。

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

【讨论】:

    【解决方案2】:

    没有直接的等价物 - 托管和非托管线程不应被视为相同。见here

    操作系统 ThreadId 与托管对象没有固定关系 线程,因为一个非托管主机可以控制之间的关系 托管和非托管线程。具体来说,一个复杂的主机可以 使用 Fiber API 调度多个托管线程 操作系统线程,或在不同的托管线程之间移动 操作系统线程。

    【讨论】:

      【解决方案3】:

      使用 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;
      
      }
      

      【讨论】:

        【解决方案4】:

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

        ThreadState 也是如此,因为它拥有线程的底层所有权,它确切地知道自己在做什么,因此可以产生有效的线程状态。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-08-09
          • 2013-05-15
          • 2017-07-04
          • 1970-01-01
          • 2011-05-06
          • 2019-10-07
          • 1970-01-01
          相关资源
          最近更新 更多