在我的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中当前线程的可读名称吗?
1条答案
按热度按时间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键,并把它放入线程本地存储器中,这需要更多的工作,但是它是一致的和可移植的。