Is there a sane way to map a pthread_t
value (as returned from pthread_create()
or std::thread::native_hanle()
) to pid(tid) in Linux? Before someone gets duplicate-happy, this is not about finding thread’s own pid (which can be done with gettid()
).
The insane way would be to somehow compel a thread to call gettid()
and pass along the result, but that’s way too much trouble.
One of the possible applications I have in mind is to reconcile threads created within program (where pthread_t
is available) with output provided by ps -T
.
Answer
One (convoluted, non-portable, Linux-specific, lightly destructive) method of mapping pthread_t
to tid
without looking into struct pthread
is as follows:
- Use
pthread_setname_np
to set a thread name to something unique. - Iterate over subdirectories of
/proc/self/task
and read a line from a file namedcomm
in each of those. - If the line equals to the unique string just used, extract
tid
from the last component of the subdirectory name. This is your answer.
The thread name is not used by the OS for anything, so it should be safe to change it. Nevertheless you probably want to set it back to the value it had originally (use pthread_getname_np
to obtain it).