C++ 11'native_handle'不是'std :: this_thread'的成员

pyC*_*hon 11 c++ c++11 stdthread

在以下代码段中,

void foo() {
  std::this_thread::native_handle().... //error here
}

int main() {
  std::thread t1(foo);

  t1.join();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

你如何获得的native_handlestd::this_thread从函数内foo

How*_*ant 13

线程无法自主获取自己的访问权限std::thread.这是有目的的,因为它std::thread是一种仅移动类型.

我相信你要求的是一个native_handle()成员std::thread::id,这是一个有趣的建议.据我所知,目前还不可能.它将被用作:

void foo()
{
    auto native_me = std::this_thread::get_id().native_handle();
    // ...
}
Run Code Online (Sandbox Code Playgroud)

它不能保证工作,甚至不存在.但是我想大多数POSIX平台都可以支持它.

尝试更改C++标准的一种方法是提交问题. 以下是如何操作的说明.

  • 我认为OP不一定要`std :: thread :: id :: native_handle`.我认为有趣的一点是:`std :: this_thread`的界面不应该模仿`std :: thread`的界面吗?当然,对于那些与线程生命周期管理相关的成员,正如您正确指出的那样,并没有多大意义.这并没有留下多少,但是`native_handle`让我感到非常明显缺席. (3认同)
  • @NicholasPezolano:可能,不要卖空自己.我的观点是,向委员会出售一些东西,这有助于他们看到*为什么需要什么.当你只是说:为什么我们不这样做时,它几乎没有帮助.我个人从未制作过跨平台线程分析器/调试器.所以我很无知这会如何简化事情.但我发现自己希望自己知道.你自己撰写的论文可以更详细地解释事情,这可能会激励委员会.或者它可能不会.很难预测未来. (2认同)
  • 为什么不像`get_id()`一样使用`std :: this_thread :: native_handle()`?可以将其视为“完成”-两种情况在所有线程系统中均可用,并且两者在逻辑上相同。如果“ this_thread :: native_handle()”出了问题,则可以说“ std :: thread :: native_handle()”也是如此。您需要激励用例吗?考虑调试。Gdb不会向您显示`this_thread :: get_id()`返回的ID为ID的线程列表。 (2认同)

chr*_*rnz 5

C ++ 11没有提供获取当前线程native_handle的机制。您必须使用平台特定的调用,即Windows上的GetCurrentThread():

void foo()
{
    auto native_me = ::GetCurrentThread();
}
Run Code Online (Sandbox Code Playgroud)

  • 我无法投票支持自己的帖子,但是当我再次遇到此问题并遇到此答案时,他大声笑了! (2认同)