Am I main?, a tale of TIDs
During my work on Rig, which will also include thread abstraction, I stumbled upon the problem of getting some
kind of ID to identify a running thread, I wanted to be able to do something akin to getpid() (or
GetCurrentProcessId() for Windows), but for threads, not processes. Solving this on Windows was easy, the Unix
world is another story.
Now, the Pthreads API doesn't offer this functionality, the closest is pthread_self(), which returns an opaque
type pthread_t, which can't (safely) be used directly to differentiate between threads. Which means that to
solve this, I needed to enter the world of non-portable, OS-specific functionality: one of the reasons I wanted
to use VMs in my previous post was in fact to try this out.
After reading a lot of documentation and trying out a few things, it became clear that each OS had a different
way of getting this information.
Coincidentally, the next day someone on StackOverflow asked an interesting question that turned out to be
related: "How to determine if the current thread is the main one?", which I set out to answer. My answer
already contains a good explanation of how to approach that problem, so I won't reiterate it here, and simply
offer a helpful reference of my overall findings.
OS | Thread ID | Is thread main? |
---|---|---|
Windows | tid = GetCurrentThreadId(); | ??? |
Linux | tid = syscall(SYS_gettid); | tid == getpid() |
FreeBSD | long lwpid; thr_self(&lwpid); tid = lwpid; |
pthread_main_np() != 0 |
MacOS X | tid = pthread_mach_thread_np(pthread_self()); | pthread_main_np() != 0 |
Solaris | tid = pthread_self(); | tid == 1 |
OpenBSD | Not available. | pthread_main_np() != 0 |
NetBSD | tid = _lwp_self(); | tid == 1 |