【问题标题】:How to get the winapi id of a thread that has been created using the standard library?如何获取使用标准库创建的线程的winapi id?
【发布时间】:2012-06-08 18:10:04
【问题描述】:

C++11 的标准库包含<thread>,它允许创建线程。但是,Windows api 需要一些功能的 ID(即PostThreadMessage)。我怎样才能得到它?

备注:std::thread::get_id() 似乎不起作用:

PostThreadMessage(m_thread->get_id(), WM_QUIT, 0, 0);

e:\documents\khook\khooker\hook_runner.cpp(129): error C2664: 'PostThreadMessageW' : cannot convert parameter 1 from 'std::thread::id' to 'DWORD'

【问题讨论】:

  • GetCurrentThreadId 有效吗?即使来自不同的线程,您也可以在相关线程中使用它并存储它,如果它首先工作的话。

标签: c++ windows multithreading winapi c++11


【解决方案1】:

thread::id 类只允许在ids 和输出之间进行比较。它不提供访问实际底层id 的方法。您可以尝试将其输出到stringstream,然后再将其解析回来,我猜。

【讨论】:

  • 我不明白字符串流有什么帮助?
  • @Qdii,ID 知道如何将自己打印到流中(用于调试)。该实现恰好只是打印其数值。在字符串流中获得数值后,您可以将其读回数值类型。
  • @RobKennedy:我可以确定 thread::id 与 windows api 值相同吗? (我认为这可能是中间库的价值,例如 pthread)。
  • 嗯,是的,但就此而言,native_handle 也可以。 “native”部分仅指C++未定义的部分。一旦你过去了,“本机”意味着实现想要或需要它意味着什么。如果线程库是直接根据操作系统实现的,那么它可能是操作系统句柄和 ID,但如果中间有另一个线程库,比如 pthread,那么它可能是一个 pthread 特定的值。从标准 C++ 的角度来看,任何一个都算作“本机”。 id 值是实现定义的,因此请检查您的实现。
【解决方案2】:

使用成员函数native_handle()。它提供本机线程句柄。然后你可以拨打GetThreadId()就可以了。

【讨论】:

  • 请注意native_handle() 为线程返回一个HANDLE (void*);您还需要GetThreadId() 从句柄中获取标识符以调用PostThreadMessage()
猜你喜欢
  • 2017-05-08
  • 1970-01-01
  • 2022-01-16
  • 2020-07-09
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多