我可以在我的代码中访问std::thread::id
,并且需要使用一些本机函数作为参数ThreadId作为DWORD
接收(与GetCurrentThreadId()
返回的相同)。
我找不到任何方法将std::thread::id
转换为Win32 DWORD
ThreadId。我能找到的最接近的是std::thread
有一个native_handle。但是我仍然无法创建std::thread
以从std::thread::id
获取native_handle,所以我仍然离我需要的太远了。
我有什么遗失的东西吗?或者标准便携式线程函数和本机函数之间的差距是如此之大,以至于标准API无法用于我的目的?
答案 0 :(得分:2)
这个答案将假设你正在使用来自MSVC2015的微软件std::thread
示例,并且有关它的文档事实将来不会改变。
在文档下无法从std::thread::id
转到native_handle
。
您可以尝试维护从std::thread::id
到std::thread
或native_handle
的表格,但实际上这需要一个瓶颈,您可以控制所有std::thread
创建。这似乎有点多。
如果您测试std::thread::id
整数的值,您会发现它与当前时间位中的本机句柄相同。因此,您可以参与相当可怕的未定义行为并提取位并转换为整数。不建议这样做,因为您依赖微软从未改变其未记录的实施细节;这是一个等待发生的错误和维护噩梦。
因此,寻求以不同的方式解决您的问题。直接请求native_handle
,或在没有本机API的情况下解决您的问题。在许多情况下,使用本机API是一个不好的迹象;这种使用的一半涉及尝试从线程外部暂停或终止一个线程,这在C ++中是一个非常糟糕的想法(通常,真的)。