我正在将代码从Linux移植到QNX7。我的代码中很多地方都使用了PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP。在Linux中,这是在pthread.h中定义的。在QNX中,我找不到它的定义位置。因此抛出错误:"PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP‘未在此处声明(不在函数中)“。
如何解决这个问题?
发布于 2020-03-15 18:35:03
/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>
发布于 2018-11-22 20:02:09
尽管递归互斥锁在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()
开始时调用一个类似上面的函数来初始化它们。
https://stackoverflow.com/questions/53430194
复制相似问题