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

标签 c++ multithreading c++11 stdthread

我可以在我的代码中访问 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::idnative_handle

您可以尝试维护从 std::thread::idstd::threadnative_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/

相关文章:

c++ - "base operand of ‘->’ 有非指针类型”但它是指针

c++ - C/C++ 将 void* 转换为 int ( * () ) (int,...);

python - 在 Python 中编写和注册自定义 Tensorflow Op

android - 带有加载动画的启动画面(Android 应用程序)

c++ - 比较 std::pairs 的 2 个 std::lists - 保持唯一和不同的元素

c++ - Winapi shell 扩展覆盖 Windows 命令

java - 我哪里不是线程安全的?

java - Java 中使用原子变量的线程安全

c++ - 具有单个参数的模糊构造函数 : initializer_list and int

C++11:无法将参数从 'T *const' 转换为 'T *&&'