How can you get the Linux thread Id of a std::thread()
c++, c++11, multithreading, pthreads
Solution
Assuming you're using GCC standard library, `std::thread::native_handle()` returns the `pthread_t` thread ID returned by `pthread_self()`, not the OS thread ID returned by `gettid()`. `std::thread::id()` is a wrapper around that same `pthread_t`, and GCC's `std::thread` doesn't provide any way to get the OS thread ID, but you could create your own mapping:
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();
}
Then create your thread with:
std::thread t1(&wrap, &SayHello);
then get the ID with something like:
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()];
}
Problem
I was playing with `std::thread` and I was wondering how is it possible to get the thread id of a new `std::thread()`, I am not talking about `std::thread::id` but rather the OS Id given to the thread ( you can view it using `pstree`). This is only for my knowledge, and it's targeted only to Linux platforms (no need to be portable). I can get the Linux Thread Id within the thread like this : ``` #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; } ``` But how can I retrieve the same id within the main loop ? I did not find a way using `std::thread::native_handle`. I believed it was possible to get it trough `pid_t gettid(void);` since the c++11 implementation relies on pthreads, but i must be wrong. Any advices ? Thank you.