'pthread_setname_np'未在此范围内声明

时间:2015-05-20 10:11:01

标签: c++ linux pthreads

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

我用Google搜索并了解'_np'的意思是'非便携式',并且这个api并非适用于所有操作系统的Linux版本。

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

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

3 个答案:

答案 0 :(得分:4)

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

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

manual表示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

答案 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。