检查当前线程是否是主线程

时间:2013-12-11 21:25:27

标签: c++ c linux multithreading pthreads

如何检查当前线程是否是linux上的主线程?看起来像gettid()只返回一个pid,但似乎linux不保证带有main()的线程总是有一个const和统一的pid。

这样做的原因是我有一个自动并行化,我想确保在已经由pthread_create()创建的线程上运行的函数中不调用pthread_create()。

2 个答案:

答案 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 线程中执行的其他函数。这是解决此类问题的更好方法。