在此范围内未声明"pthread_setname_np"
'pthread_setname_np' was not declared in this scope
我在应用程序中创建了多个线程。我想给每个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_np
和pthread_getname_np
是在glibc 2.12
中介绍的。因此,如果您使用的是较旧的glibc(例如2.5),那么定义_GNU_SOURCE
将没有帮助。
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。
相关文章:
- 什么等于 np.linalg.solve(A, B) 的 Python 在特征C++
- 这个循环是什么意思:for(j,0,np)
- (也许是NP-Hard)求一个集合的子集总数,使得每个子集在与其所有元素相乘时的值都大于X
- np.arange与C++iota的比较,iota更慢
- 如何使用 <numpy/arrayobject.h> 在 c++ 中将数据从 np.array 获取到 std::vector?
- 在C 中实现Python np.fromstring()
- 有没有办法像python:np.concatenate([x,y,z],axis=1)中那样沿着列连接三个二维向量C++
- 文件写入权限在Firebreath NP插件中被拒绝
- 将numpy指针(dtype=np.bool)传递给C++