【问题标题】:Linux: get Thread ID by handle from boost::thread [duplicate]Linux:通过句柄从 boost::thread [重复] 获取线程 ID
【发布时间】:2014-09-29 00:57:56
【问题描述】:

我正在使用boost::thread(在下一步中使用pthread),但想通过boost::thread 指针获取线程ID/(轻量级)pid。我设法通过使用成员 native_handle() 在 Windows 上做到这一点,但我找不到 linux 的替代方案。

boost::thread * boost_thread ptr = new boost::thread(/*...*/);
ptr->native_handle();

我发现很多关于 current 线程的帖子都使用 pthread_self() 之类的东西,但我不想从这个线程中获取线程 ID,我想从我刚刚使用new boost::thread 创建的线程的外部。有没有办法通过使用本机句柄或 boost::thread 结构中的某些东西来检索线程 id/pid?

非常感谢!

编辑:不重复导致其他线程无法解决此问题...至少在从boost::thread 获取pthread_t 时不会,因此对它的创建没有影响。或以如下方式解决:不可能。

【问题讨论】:

  • boost::thread::native_handle() 在 Linux 上为线程返回 pthread_t。因此,您的问题实际上是重复的。
  • 您需要 linux 线程 ID 做什么?您使用 boost::thread,因此您显然没有实现自己的线程库,那么为什么需要访问内核详细信息?
  • 所以如果我正确理解另一个线程是不可能的?
  • @user2079303:我想要这个用于调试目的。我想在 htop 中查看结果并与我的日志进行比较,同时以与当前在 windows 中相同的方式使用 linux。但为此,我需要将我的内部线程视图与外部线程视图进行比较(例如 htop)
  • 我检查了pthread_t 的定义,它似乎不会让我在短期内得到任何结果。这些字段似乎没有我需要的:void * handle; void *(* func )(void *arg); void * arg; void * ret;

标签: c++ linux pthreads boost-thread


【解决方案1】:

最简单的解决方案是直接从线程getpid() 调用getpid()。 (请不要忘记,Linux中的进程和线程几乎是一样的,所以需要进程ID)。

【讨论】:

  • 在多线程程序中这很不一样。
  • 在为多个平台创建之后,可能可以扩展boost::thread并包装调用约定以包含getpid()并将其提供给外界
【解决方案2】:

在大多数 unixoid 上,pid_t current_thread_id = gettid(); 会返回当前线程 id,但 glibc 不提供此功能。相反,您必须致电:

pid_t current_thread_id = (pid_t) syscall(__NR_gettid);

从该线程外部获取 id 将变得很困难。使用 pthread 的本机句柄是获取线程 ID 的一种不受支持的方式。使用boost::thread::get_id()会返回一个对象,所以不是轻量级的。

【讨论】:

  • 谢谢...我不想尝试访问私有对象数据,但boost::thread::id 的私有实现细节确实包括 id... 至少在 windows 中。
【解决方案3】:

在 Linux 上,我可以使用 boost::this_thread::get_id() 获取线程 ID

#include <iostream>
#include <boost/thread.hpp>


void func(){

  std::cout<<"Thrd Id "<<boost::this_thread::get_id()<<" "<<std::endl;
}


int main(){

  boost::thread thd1(&func);

  std::cout<<std::endl;
  boost::thread thd2(&func);

  while(1){}

  return 0;
}

输出:

Thrd Id 7f8ddcef8700
Thrd Id 7f8dd44f7700

【讨论】:

  • 这不是线程的id,是16bit整数的正数。
  • 看起来不错,但遗憾的是 id 与进程监视器中的 ID 不相关
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-24
  • 2016-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多