如何在androidndk中获取线程名称

How to obtain thread name in android ndk

在我的 Android 项目中,我使用 std::thread。 我也在一些 Linux 和 OSX 项目中使用相同的 C++ 代码。

出于调试目的,我想评估人类可读的线程名称,我通过调用 pthread_setname_np()(因为缺少 std::thread::set_name())来实现。

如果稍后出现调试输出,我会尝试通过调用 pthread_getname_np() 来获取当前线程名称,这很有效,例如在 Linux 目标上。

但令我惊讶的是,Android Ndk pthread.h 中没有 pthread_getname_np(),例如ndk-bundle/platforms/android-19/arch-arm/usr/include/pthread.h 也不在 ndk-bundle/platforms/android-21/arch-arm/usr/include/pthread.h

一个愚蠢的前向声明尝试:

extern "C" int pthread_getname_np(pthread_t, char*, size_t);

因链接器错误而失败(如预期)。

知道如何从 C/C++ 代码中获取 Android 中当前线程的人类可读名称吗?

您可以在 dalvik/vm/Thread.cpp 中看到 Dalvik 是如何设置它们的。如果可用,它使用 pthread_setname_np(),如果不可用,则使用 prctl(PR_SET_NAME)。因此,如果 pthread_getname_np() 不可用 - 请记住 "np" 表示 "non-portable" - 您可以使用 prctl(PR_GET_NAME) 获取 16 字节的空终止字符串Linux.

您可以通过在 /proc 个条目中四处寻找其他位。

如果您对名称的大小和格式有特定要求,那么您可能想要定义一个 pthread 键并将其放入线程本地存储中。它需要更多工作,但它具有一致性和便携性。