在此范围内未声明"pthread_setname_np"

'pthread_setname_np' was not declared in this scope

本文关键字:setname np pthread 未声明 范围内      更新时间:2023-10-16

我在应用程序中创建了多个线程。我想给每个pthread分配一个名字,所以我使用了pthread_setname_np,它在Ubuntu上工作,但在SUSE Linux上不工作。

我谷歌了一下,发现'_np'的意思是'不可移植',这个api并不是在所有的Linux操作系统上都可用。

所以现在我想只在API可用的情况下才这样做。如何确定api是否可用?我需要这样的东西

#ifdef SOME_MACRO
    pthread_setname_np(tid, "someName");
#endif

您可以使用feature_test_macro _GNU_SOURCE来检查此功能是否可用:

#ifdef _GNU_SOURCE
    pthread_setname_np(tid, "someName");
#endif

但是手册中说pthread_setname_nppthread_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

由于这个函数是在glibc 2.12中引入的,所以您可以使用:

#if ((__GLIBC__ > 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 12)))
    pthread_setname_np(tid, "someName");
#endif

这种事情——找出一个特定的函数是否存在于你的编译环境中——就是人们使用GNU Autoconf脚本的目的。

如果您的项目已经使用autoconf,您可以在检查pthreads编译器和链接器标志之后,将其添加到配置源代码中:

AC_CHECK_FUNCS(pthread_setname_np)

…如果函数存在,它将定义一个宏HAVE_PTHREAD_SETNAME_NP。