如何检查当前线程是否是linux上的主线程?看起来像gettid()只返回一个pid,但似乎linux不保证带有main()的线程总是有一个const和统一的pid。
这样做的原因是我有一个自动并行化,我想确保在已经由pthread_create()创建的线程上运行的函数中不调用pthread_create()。
答案 0 :(得分:11)
对于Linux:
如果getpid()
返回与gettid()
相同的结果,那么它就是主线程。
int i_am_the_main_thread(void)
{
return getpid() == gettid();
}
来自man gettid
:
gettid()返回调用者的线程ID(TID)。在单线程进程中,线程ID等于进程ID(PID,由 getpid(2)返回)。在多线程进程中,所有线程都具有相同的PID,但每个线程都有 有一个独特的TID。
来自man clone
:
线程组是Linux 2.4中添加的一项功能,用于支持 POSIX线程概念是一组共享单个线程的线程 PID。在内部,这个共享PID就是所谓的线程 线程组的组标识符(TGID)。自Linux 2.4,调用 getpid(2)返回调用者的TGID。
组内的线程可以通过它们来区分 (系统范围内)唯一线程ID(TID)。一个新线程的TID是 可用作函数结果返回给调用者 clone(),线程可以使用 gettid(2)获取自己的TID。
答案 1 :(得分:3)
使用pthread_self()
怎么样?
这将返回调用线程的thread_id
。使用此函数,您可以存储主线程ID(当您知道为main时),并稍后将其与pthread_self()
返回的其他值进行比较,以确定它们是主线程还是另一个。
虽然我认为拥有结构良好的代码更明智。类似于 slave 线程中要执行的函数以及要在 master 线程中执行的其他函数。这是解决此类问题的更好方法。