gpt4 book ai didi

c++ - 我如何判断 pthread_self 是否是进程中的主(第一个)线程?

转载 作者:IT王子 更新时间:2023-10-29 00:09:46 26 4
gpt4 key购买 nike

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

另请注意:库代码并不总是首先从主线程进入。

最佳答案

这有点可行,具体取决于您所使用的平台,但绝对不是以任何可移植和通用的方式...

根据他们的 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 方法。

希望对您有所帮助,祝您有美好的一天!

关于c++ - 我如何判断 pthread_self 是否是进程中的主(第一个)线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4867839/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com