我怎么能告诉pthread_self是在这个过程中的主要(第一)线程?

背景:我正在处理许多程序使用的日志logging库。
我为每个线程分配一个人类可读的名字,主线程应该是“主”,但我希望能够从库内检测到的状态,而不需要在每个main()函数开始的代码。

另请注意:库代码不会总是首先从主线程input。

Solutions Collecting From Web of "我怎么能告诉pthread_self是在这个过程中的主要(第一)线程?"

这是有点可行的,取决于你的平台,但绝对不是以任何便携和通用的方式…

根据他们的pthread.h文件,Mac OS X似乎是唯一一个直接和文档化的方法:

 /* returns non-zero if the current thread is the main thread */ int pthread_main_np(void); 

我还发现FreeBSD有一个定义pthread_main_np()的pthread_np.h头文件,所以这也适用于FreeBSD(至少8.1),OpenBSD(至少4.8)在pthread.h中定义了pthread_main_np()。 请注意,_np明确表示不可移植!

否则,想到的唯一更“普遍”的方法是将进程的PID与当前线程的TID进行比较,如果它们匹配,则该线程是主要的。 这并不一定适用于所有的平台,它取决于你是否真的可以得到一个TID(你不能在OpenBSD中),如果你这样做,如果它和PID有任何关系,或者线程子系统有自己的会计,不一定涉及。

我也发现一些平台会给主线程返回TID的常量值,所以你可以检查这些值。

我检查过的平台的简要总结:

  • Linux: 可能在这里 ,系统调用(SYS_gettid)== getpid()是你想要的
  • FreeBSD:在这里不可能,thr_self()似乎是随机的,与getpid()没有关系
  • OpenBSD:不可能在这里,没有办法得到一个TID
  • NetBSD: 可能在这里 ,_lwp_self()总是为主线程返回1
  • Solaris: 可能在这里 ,pthread_self()总是为主线程返回1

所以基本上你应该可以直接在Mac OS X,FreeBSD和OpenBSD上完成。

您可以在Linux上使用TID == PID方法。

您可以在NetBSD和Solaris上使用TID == 1方法。

我希望这会有所帮助,祝你有个美好的一天!

从main()调用pthread_self()并记录结果。 将未来调用pthread_self()与您的存储值进行比较,以确定您是否在主线程上。

你可以使用某种共享的名字资源,它允许产生线程来注册一个名字(也许是线程ID的地图)。 您的日志记录系统可以通过线程标识以线程安全的方式将调用放入一个获取名称的方法中。

当线程死亡时,从映射中删除它的名字以避免内存泄漏。

这个方法应该允许所有的线程被命名,而不仅仅是main。