如何在Linux上检查当前线程是否为主线程?看起来gettid()仅返回一个pid,但似乎Linux不能保证具有main()的线程始终具有常数和统一的pid。
之所以这样做是因为我正在进行自动并行化,并且我想确保不会在已经在由pthread_create()创建的线程上运行的函数中调用pthread_create()。
如何在Linux上检查当前线程是否为主线程?看起来gettid()仅返回一个pid,但似乎Linux不能保证具有main()的线程始终具有常数和统一的pid。
之所以这样做是因为我正在进行自动并行化,并且我想确保不会在已经在由pthread_create()创建的线程上运行的函数中调用pthread_create()。
对于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。
#include <sys/syscall.h> syscall(SYS_gettid);
来替换gettid(),现在它可以工作了! - user2958862pthread_self()
和gettid()
返回的值很可能不相同。在Linux上它们绝对不相同。 - alk使用pthread_self()
如何?
此函数返回调用线程的thread_id
。通过此函数,您可以存储主线程id(当您知道是主线程时),并将其与其他从pthread_self()
返回的值稍后进行比较,以确定它们是主线程还是其他线程。
虽然我认为更明智的做法是编写结构良好的代码。例如,在从属线程中执行的函数和在主线程中执行的其他函数。这是解决此类问题的更好方法。