我可以在我的代码中访问 std::thread::id
,并且需要使用一些 native 函数,这些函数将 ThreadId 作为参数接收为 DWORD
(与由 GetCurrentThreadId()
返回)。
我找不到任何方法将 std::thread::id
转换为 Win32 DWORD
ThreadId。我能找到的最接近的东西是 std::thread
有一个 native_handle .但我仍然无法创建 std::thread
来获取 native_handle来自 std::thread::id
,所以我离我需要的还差得很远。
有什么我想念的吗?还是标准可移植线程函数和 native 函数之间的差距如此之大,以至于标准 api 无法用于我的目的?
最佳答案
此答案假定您使用的是来自 MSVC2015 的 Microsoft std::thread
示例,并且有关它的记录事实在未来不会改变。
在文档下没有办法从 std::thread::id
到 native_handle
。
您可以尝试维护从 std::thread::id
到 std::thread
或 native_handle
的表,但是实际上需要一个瓶颈,您可以在其中控制所有 std::thread
创建。这似乎有点多。
如果您测试 std::thread::id
整数的值,您会发现它与 当前时间的 native 句柄相同。所以你可以从事相当可怕的未定义行为并提取位并转换为整数。不建议这样做,因为您相信微软永远不会更改其未记录的实现细节;这是等待发生的错误和维护噩梦。
所以寻求以不同的方式解决您的问题。直接请求 native_handle
,或在没有 native API 的情况下解决您的问题。在许多情况下,使用 native API 是一个不好的迹象;这种使用的一半涉及尝试从线程外部挂起或终止线程,这在 C++ 中是一个非常非常糟糕的主意(通常,真的)。
关于c++ - 从 std::thread::id 结构中检索 Windows 线程标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36865846/