2013-12-11 35 views
10

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

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

+0

为什么不写出明智的代码知道发生了什么。你能否记得你是通过'pthread_create'创建的。它只是一个布尔值 –

+0

您是否尝试了系统调用(SYS_gettid)?请记住包含sys/syscall。h – stackmate

回答

10

对于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中加入支持一组共享一个 PID线程的 POSIX线程概念的特征。在内部,该共享PID是线程组的所谓线程 组标识符(TGID)。由于Linux 2.4,致电getpid(2)返回调用者的TGID。

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

+0

谢谢!顺便说一句我在使用gettid()的linux机器上的一个附注没有定义。我在另一篇文章中发现使用'#include syscall(SYS_gettid);'替换get gettid(),现在它正在工作! – user2958862

2

如何使用pthread_self()

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

虽然我认为有更好的结构化代码。类似从线程线程和其他功能主线程要执行的功能。这是解决这类问题的更好方法。

+0

原因是,就像我放在原来的帖子,我正在做**自动**并行化,这意味着我不能假设原来的给定程序是如何看起来像,所以我需要运行时检查,看看哪个线程,具体pthread_create( )可能已开启。 – user2958862

+0

这就是为什么我需要检查当前的线程,而不是用更简单的方式去编写一个组织良好的程序 – user2958862

+0

这似乎是合理的,'thread_self()'是否适合您的需求? –