如何在android ndk中获取线程名

t5zmwmid  于 2022-12-16  发布在  Android
关注(0)|答案(1)|浏览(346)

在我的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中当前线程的可读名称吗?

efzxgjgh

efzxgjgh1#

你可以在dalvik/vm/Thread.cpp中看到Dalvik是如何设置它们的。如果pthread_setname_np()可用,它使用pthread_setname_np(),如果prctl(PR_SET_NAME)不可用,那么如果pthread_getname_np()不可用--记住“np”意味着“不可移植”--你可以在Linux下使用prctl(PR_GET_NAME)来获得一个16字节的以空结尾的字符串。
您可以在/proc条目中查找其他位。
如果你对名字的大小和格式有特殊的要求,那么你可能需要定义一个pthread键,并把它放入线程本地存储器中,这需要更多的工作,但是它是一致的和可移植的。

相关问题