前言
最近在native开发过程为了分析SDK使用线程情况,设置线程名过程中遇到了两个“坑”,故做下简单的总结记录同时跟大家分享一下。
注:这里的native线程,是指用使用pthread创建的线程或直接使用c++的std::thread类来创建新的线程,Andorid/linux上使用prctl(PR_SET_NAME, thread_name, 0, 0, 0)来设置线程名
总结
第一点:设置线程名可能会失效
一般情况下我们native的线程是需要跟java层的模块交互的,由于native线程是没有JVM环境的,所以在在native线程操作java层的代码前,需要attched到JVM于便获取到线程的JVM环境,才能继续调用Java层的接口/代码。通常attched的代码如下
//G_JavaVM在JNI_OnLoad的时候缓存了
G_JavaVM->AttachCurrentThread(&tmpEnv, NULL)
// 第二个JavaVMAttachArgs 参数为NULL,之前设置的线程名会变成Thread-xxx这种名称
如果需要保持之前设置的线程名有效,需要配置JavaVMAttachArgs中的线程名,示例代码如下
//获取之前设置的线程名
char thread_name[128] = {0};
prctl(PR_GET_NAME, (char *)(thread_name));
JavaVMAttachArgs args;
args.version = JNI_VERSION_1_6;
// 赋值到JavaVMAttachArgs的name
args.name = (char *)thread_name;
args.group = NULL;
G_JavaVM->AttachCurrentThread(&tmpEnv, JavaVMAttachArgs)
第二点:线程名有长度限制
不要设置太长的线程名,线程名的长度是16个字节,包括结束符’\0’,有效的长度是15个字节