【问题标题】:Compare thread IDs using windows api使用 windows api 比较线程 ID
【发布时间】:2014-04-29 19:55:58
【问题描述】:

我正在使用 Windows api 线程,我想比较线程 ID。

首先,我使用CreateThread() 创建一个线程并存储我从函数中获得的句柄(HANDLE)和ID(LPDWORD)。

然后我使用 GetCurrentThread()GetThreadId() 从创建的线程中获取句柄和 ID。

我总是得到两个句柄和两个 ID 的不同值。

有没有办法以与 pthread 类似的方式比较线程?

我这样做是为了作为确认正确执行的调试选项。我总是从其他库(pthread.h、threads.h)中得到正确的结果,但从 windows api 中却没有。这不是一个关键问题,但我想学习winapi中的过程

【问题讨论】:

  • 只是好奇,GetCurrentThreadId() 是否返回您期望的值?
  • @HerrJoebob 是的,它得到了正确的值。如果我在线程中使用 GetCurrentThread() 中的 GetThreadId(),我也会得到正确的值。但是在 main 中这样做会给出错误的值。
  • 如果这两个变体有效,我不确定到底出了什么问题。在任何情况下,“使用 GetCurrentThread() 从创建的线程中获取句柄 [...]”听起来是错误的,因为当前线程是正在执行调用的线程,因此您只能获取该线程的值,而不是一个不同的。你能澄清一下,也许可以添加一些代码并详细说明你的期望吗?就目前而言,您的问题无法回答。
  • 只比较线程ID,不比较处理值。

标签: c windows multithreading winapi


【解决方案1】:

您可以使用 GetCurrentThreadId() 来代替 GetCurrentThread() 和 GetThreadId() [http://msdn.microsoft.com/en-us/library/windows/desktop/ms683183%28v=vs.85%29.aspx]. 如前所述,不要在另一个线程上使用伪 HANDLE(由 GetCurrentThread() 返回)。

据我所知,一个线程可能有多个不同的 HANDLE,但 ID 应该是唯一标识符。

【讨论】:

    【解决方案2】:

    GetCurrentThread() 不返回真实句柄。来自 MSDN:

    检索调用线程的伪句柄。 ... 伪句柄是一个特殊常量,被解释为当前线程句柄。

    您无法将此值与CreateThread() 的结果进行比较。如果您在不同线程的GetThreadId() 中使用此值,您也将无法获得所需的 ID。

    您可以在伪句柄上使用DuplicateHandle() 来检索真实句柄。

    【讨论】:

    • 更新了我的答案。你可以例如使用 DuplicateHandle()。
    • 你有关于函数msdn.microsoft.com/en-us/library/windows/desktop/… 的任何信息吗?这似乎是正确的,但编译器坚持认为我的两个参数还不够。
    • 这是错误的函数,我的意思是this one
    • 使用 DuplicateHandle 会给出不同的句柄(与 main 中的不同)但结果相同。
    • 您还在比较句柄吗?你不能这样做,你需要使用句柄来获取线程ID。同一个线程可以有多个不同的句柄。但是一个线程只有一个ID。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 2022-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多