我正在将代码从Linux移植到QNX7。在我的代码的很多地方都使用了PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP。在Linux中,这是在pthread.h中定义的。在QNX中,我无法找到定义的位置。因此抛出错误: “此处未声明PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP'(不在函数中)”。
该如何解决?
答案 0 :(得分:0)
尽管递归互斥已在POSIX中进行了标准化,但该标准并未为其指定静态初始化程序(PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
是glibc扩展)。
这意味着具有可移植性,您需要使用pthread_mutex_init()
手动初始化递归互斥体:
int init_recursive_mutex(pthread_mutex_t *mutex)
{
pthread_mutexattr_t attr;
int r;
r = pthread_mutexattr_init(&attr);
if (r != 0)
return r;
r = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
if (r == 0)
r = pthread_mutex_init(mutex, &attr);
pthread_mutexattr_destroy(&attr);
return r;
}
对于要静态初始化的互斥锁,您可以改为使用main()
开头的每个互斥锁调用的上述函数来初始化它们。
答案 1 :(得分:0)
/usr/include/pthread.h:
# ifdef __USE_GNU
# define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP \
{ { 0, 0, 0, 0, PTHREAD_MUTEX_RECURSIVE_NP, __PTHREAD_SPINS, { 0, 0 } } }
在包含pthread之前尝试定义__USE_GNU:
#define __USE_GNU
#include <pthread.h>