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

12

如何在Linux上检查当前线程是否为主线程?看起来gettid()仅返回一个pid,但似乎Linux不能保证具有main()的线程始终具有常数和统一的pid。

之所以这样做是因为我正在进行自动并行化,并且我想确保不会在已经在由pthread_create()创建的线程上运行的函数中调用pthread_create()。


你尝试过使用syscall(SYS_gettid)吗?记得要包含sys/syscall.h。 - stackmate
2个回答

13

对于Linux:

如果getpid()返回的结果和gettid()相同,则它是主线程。

int i_am_the_main_thread(void)
{
  return getpid() == gettid();
}

来自gettid的说明:

gettid()函数返回调用者的线程ID (TID)。在单线程进程中,线程ID等于进程ID(PID),由getpid(2)返回。 在多线程进程中,所有线程具有相同的PID,但每个线程都有唯一的TID。

来自clone的说明:

Linux 2.4引入了线程组作为支持POSIX线程的功能,线程组是一组共享一个进程ID(PID)的线程。在内部,这个共享的PID被称为线程组标识符(TGID)。从Linux 2.4开始,getpid(2)调用返回调用者的TGID。

线程组内的线程可以通过它们的系统范围内唯一的线程ID(TID)进行区分。新线程的TID可作为clone()的返回值提供给调用者,线程可以使用gettid(2)获取自己的TID。


2
谢谢!顺便提一下,我正在使用的Linux机器上没有定义gettid()。我在另一篇帖子中发现可以使用#include <sys/syscall.h> syscall(SYS_gettid);来替换gettid(),现在它可以工作了! - user2958862
存储pthread_self id值的速度要快得多,因为这只需要两个缓慢的系统调用。 - Lothar
@Lothar:pthread_self()gettid()返回的值很可能不相同。在Linux上它们绝对不相同。 - alk

4

使用pthread_self()如何?

此函数返回调用线程的thread_id。通过此函数,您可以存储主线程id(当您知道是主线程时),并将其与其他从pthread_self()返回的值稍后进行比较,以确定它们是主线程还是其他线程。

虽然我认为更明智的做法是编写结构良好的代码。例如,在从属线程中执行的函数和在线程中执行的其他函数。这是解决此类问题的更好方法。


原因是像我在原始帖子中提到的那样,我正在进行自动并行化,这意味着我无法假设原始给定程序的样子,因此我需要运行时检查以查看特定pthread_create()可能在哪个线程上。 - user2958862
这就是为什么我需要检查当前线程而不是选择编写一个结构良好的程序的简单路线的原因。 - user2958862
@user2958862:是的,我测试过了,这是一种非常干净的解决方法。很高兴你能解决你的问题 :) - Paulo Bu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接