从std :: thread :: id结构中检索Windows线程标识符

时间:2016-04-26 13:05:35

标签: c++ multithreading c++11

我可以在我的代码中访问std::thread::id,并且需要使用一些本机函数作为参数ThreadId作为DWORD接收(与GetCurrentThreadId()返回的相同)。

我找不到任何方法将std::thread::id转换为Win32 DWORD ThreadId。我能找到的最接近的是std::thread有一个native_handle。但是我仍然无法创建std::thread以从std::thread::id获取native_handle,所以我仍然离我需要的太远了。

我有什么遗失的东西吗?或者标准便携式线程函数和本机函数之间的差距是如此之大,以至于标准API无法用于我的目的?

1 个答案:

答案 0 :(得分:2)

这个答案将假设你正在使用来自MSVC2015的微软件std::thread示例,并且有关它的文档事实将来不会改变。

在文档下无法从std::thread::id转到native_handle

您可以尝试维护从std::thread::idstd::threadnative_handle的表格,但实际上这需要一个瓶颈,您可以控制所有std::thread创建。这似乎有点多。

如果您测试std::thread::id整数的值,您会发现它与当前时间中的本机句柄相同。因此,您可以参与相当可怕的未定义行为并提取位并转换为整数。不建议这样做,因为您依赖微软从未改变其未记录的实施细节;这是一个等待发生的错误和维护噩梦。

因此,寻求以不同的方式解决您的问题。直接请求native_handle,或在没有本机API的情况下解决您的问题。在许多情况下,使用本机API是一个不好的迹象;这种使用的一半涉及尝试从线程外部暂停或终止一个线程,这在C ++中是一个非常糟糕的想法(通常,真的)。