我在我的应用程序中创建了多个线程。我想为每个pthread分配一个名称,所以我使用了pthread_setname_np
,它在Ubuntu上工作,但不在SUSE Linux上工作。
我用Google搜索并了解'_np'的意思是'非便携式',并且这个api并非适用于所有操作系统的Linux版本。
所以现在我只想在API可用时才这样做。如何确定api是否可用?我需要这样的东西。
#ifdef SOME_MACRO
pthread_setname_np(tid, "someName");
#endif
答案 0 :(得分:4)
您可以使用feature_test_macro _GNU_SOURCE
检查此功能是否可用:
#ifdef _GNU_SOURCE
pthread_setname_np(tid, "someName");
#endif
但manual表示pthread_setname_np
和pthread_getname_np
已在glibc 2.12
中引入。因此,如果您使用较旧的glibc(例如2.5),那么定义_GNU_SOURCE
将无济于事。
因此,最好避免使用这些非可移植功能,并且您可以轻松地命名线程作为线程创建的一部分,例如,使用线程ID和数组之间的映射如:
pthread_t tid[128];
char thr_names[128][256]; //each name corresponds to on thread in 'tid'
您可以使用以下方法检查glibc版本:
getconf GNU_LIBC_VERSION
答案 1 :(得分:2)
由于glibc 2.12中引入了此功能,您可以使用:
#if __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 12
pthread_setname_np(tid, "someName");
#endif
答案 2 :(得分:1)
这种事情 - 查明编译环境中是否存在特定功能 - 是人们使用GNU Autoconf脚本的原因。
如果您的项目已经在使用autoconf,您可以在检查pthreads编译器和链接器标志之后将其添加到配置源:
AC_CHECK_FUNCS(pthread_setname_np)
...如果函数存在,它将定义宏HAVE_PTHREAD_SETNAME_NP。