你怎么能得到一个std :: thread()的Linux线程ID

时间:2013-03-29 18:13:43

标签: c++ multithreading c++11 pthreads

我正在玩std::thread,我想知道如何获得新std::thread()的线程ID,我不是在讨论std::thread::id而是在给出操作系统ID到线程(您可以使用pstree查看)。 这仅限于我的知识,它仅针对Linux平台(无需可移植)。

我可以像这样在线程中获取Linux Thread Id:

#include <iostream>
#include <thread>
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>

void SayHello()
{
    std::cout << "Hello ! my id is " << (long int)syscall(SYS_gettid) << std::endl;
}

int main (int argc, char *argv[])
{
    std::thread t1(&SayHello);
    t1.join();
    return 0;
}

但是如何在主循环中检索相同的id?我找不到使用std::thread::native_handle的方法。我认为有可能通过pid_t gettid(void);得到它,因为c ++ 11实现依赖于pthreads,但我一定是错的。

有什么建议吗? 谢谢。

3 个答案:

答案 0 :(得分:5)

假设您正在使用GCC标准库,std::thread::native_handle()将返回pthread_t返回的pthread_self()线程ID,而不是gettid()返回的操作系统线程ID。 std::thread::id()是同一个pthread_t的包装器,而GCC的std::thread没有提供任何获取操作系统线程ID的方法,但您可以创建自己的映射:

std::mutex m;
std::map<std::thread::id, pid_t> threads;
void add_tid_mapping()
{
  std::lock_guard<std::mutex> l(m);
  threads[std::this_thread::get_id()] = syscall(SYS_gettid);
}
void wrap(void (*f)())
{
  add_tid_mapping();
  f();
}

然后用:

创建你的主题
std::thread t1(&wrap, &SayHello);

然后获取ID:

pid_t tid = 0;
while (tid == 0)
{
  std::lock_guard<std::mutex> l(m);
  if (threads.count(t1.get_id()))
    tid = threads[t1.get_id()];
}

答案 1 :(得分:1)

某些pthread implementations,例如Android 21 +,提供

pid_t pthread_gettid_np(pthread_t);

实现可以使用struct pthread_t的内部结构来检索本机线程ID,与在该线程的上下文中调用时gettid()syscall(SYS_gettid)返回的线程ID相同。 / p>

答案 2 :(得分:0)

这个怎么样:

pid_t gettid (void)
{
    return syscall(__NR_gettid);
}

http://yusufonlinux.blogspot.com/2010/11/get-thread-id-from-linux.html

看起来__NR_gettid在unistd.h中定义