【问题标题】:<Windows>Why does std::thread::native_handle return a value of type 'long long unsigned int' instead of void* (a.k.a. HANDLE)?<Windows>为什么 std::thread::native_handle 返回 'long long unsigned int' 类型的值而不是 void*(又名 HANDLE)?
【发布时间】:2020-10-26 07:05:51
【问题描述】:

我需要通过 msys 上的 Windows SDK 在 Windows 上挂起一个线程。 我尝试了类似的东西

std::thread thread(somefunction, someparameters);
HANDLE handle=thread.native_handle();
SuspendThread(handle);

但是 gcc 告诉我 native_handle() 的返回值是 'long long unsigned int' 但不是 void*。 所以我尝试了

HANDLE handle=reinterpret_cast<HANDLE>(thread.native_handle());

但它不起作用,因为当我调用 GetLastError() 时,我收到了错误代码 6,这意味着句柄无效。 我该怎么办?

【问题讨论】:

    标签: c++ windows multithreading msys


    【解决方案1】:

    返回的“句柄”是线程id而不是CreateThread返回的HANDLE

    您需要使用OpenThread 从id 中获取句柄。

    【讨论】:

    • 返回的“句柄”只兼容pthread.h?
    • @Soha "Pthread" 是 POSIX 线程系统,与 Windows 线程系统无关。
    • @Soha 不,您只需要调用OpenThread()native_handle() 返回的“句柄”(实际上是线程ID)中检索有用的(Win32)句柄。
    • 我想这是特定于 Msys 的,在这种情况下,应该更新问题上的标签以反映它。 Microsoft 的 C++ 库被记录为返回实际的 native handle,而不是 TID。
    • @ErykSun 错过了那个 MSYS 位(确实它应该在标签列表中,但提到 gcc 应该是一个提示)。另一方面,该类型不符合已记录的 Windows TID 的 DWORD 类型。正如你所说,它可能是 MSYS 特定的“句柄”,然后可能甚至 OpenThread 都不起作用。
    猜你喜欢
    • 2016-07-22
    • 1970-01-01
    • 2012-05-26
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    相关资源
    最近更新 更多