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

我如何检查当前线程是否是Linux上的主线程? 它看起来像gettid()只返回一个PID,但似乎Linux不保证与main()的线程总是有一个常量和统一的PID。

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

Solutions Collecting From Web of "检查当前线程是否是主线程"

对于Linux:

如果getpid()返回与gettid()相同的结果, 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中添加的一个功能,用于支持共享单个PID的一组线程的POSIX线程概念。 在内部,这个共享PID是线程组的所谓的线程组标识符(TGID)。 从Linux 2.4开始,调用getpid(2)返回调用者的TGID。

组中的线程可以通过它们的(系统范围的)唯一线程ID(TID)来区分。 一个新的线程的TID可作为返回给clone()的调用者的函数结果,并且一个线程可以使用gettid(2)获得它自己的TID。

那么使用pthread_self()呢?

这将返回调用线程的thread_id 。 使用这个函数,你可以存储主线程的id(当你知道是主线程的时候),并且稍后和从pthread_self()返回的其他值进行比较,以确定它们是主线程还是另一个主线程。

虽然我认为有更好的结构化代码。 类似于要在线程中执行的函数以及要在线程中执行的其他函数。 这是解决这类问题的更好方法。