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


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

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


13049
2017-12-11 21:25


起源

为什么不编写明智的代码知道发生了什么。你能记住你是由你创造的吗? pthread_create。它只是一个布尔值 - Ed Heal
您是否尝试过系统调用(SYS_gettid)?请记住包含sys / syscall.h - stackmate


答案:


对于Linux:

如果 getpid() 返回相同的结果 gettid() 这是主线索。

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

man gettid

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

man clone

线程组是Linux 2.4中添加的一项功能,用于支持   POSIX线程概念是一组共享单个线程的线程   PID。在内部,这个共享PID就是所谓的线程   线程组的组标识符(TGID)。自Linux   2.4,来电 GETPID(2) 返回调用者的TGID。

组内的线程可以通过它们区分   (系统范围内)唯一线程ID(TID)。一个新线程的TID是   可用作函数结果返回给调用者    克隆(),一个线程可以使用获取自己的TID gettid(2)


11
2017-12-12 15:57



谢谢!顺便提一下我在使用gettid()的linux机器上没有定义。我发现在另一篇文章中说使用 #include <sys/syscall.h> syscall(SYS_gettid); 替换get gettid(),现在它正在工作! - user2958862


怎么样使用 pthread_self()?。

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

虽然我认为拥有结构良好的代码更明智。类似于要执行的函数 奴隶 线程和其他要在中执行的函数  线。这是解决此类问题的更好方法。


2
2017-12-11 21:36



原因是,就像我把原来的帖子放进去一样 自动 并行化意味着我无法假设原始给定程序是什么样的,所以我需要运行时检查以查看特定pthread_create()可能在哪个线程上。 - user2958862
这就是为什么我需要检查当前的线程,而不是更简单的编写一个组织良好的程序 - user2958862
这似乎是合理的 thread_self() 适合您的需求? - Paulo Bu
上面发布的getpid()和gettid()比较有效。 :) - user2958862
@ user2958862:是的,我测试了,这是一个非常干净的方法。我很高兴你能解决你的问题:) - Paulo Bu