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

use*_*862 11 c c++ linux multithreading pthreads

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

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

alk*_*alk 11

对于Linux:

如果getpid()返回与gettid()主线程相同的结果.

int i_am_the_main_thread(void)
{
  return getpid() == gettid();
}
Run Code Online (Sandbox Code Playgroud)

来自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)来区分.函数结果返回给clone()的调用者时,新线程的TID可用 ,并且线程可以使用gettid(2)获取自己的TID .

  • 谢谢!顺便说一句,我正在使用 gettid() 的 linux 机器上的旁注没有定义。我在另一篇文章中发现使用 `#include <sys/syscall.h> syscall(SYS_gettid);` 来替换 get gettid() 现在它正在工作! (2认同)

Pau*_* Bu 5

那使用呢pthread_self()

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

尽管我认为拥有结构良好的代码更明智。比如要在从属线程中执行的函数和要在线程中执行的其他函数。这是解决此类问题的更好方法。