【发布时间】:2018-11-22 11:39:35
【问题描述】:
我正在将代码从 Linux 移植到 QNX 7。我的代码中的许多地方都使用了 PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP。在 Linux 中,这是在 pthread.h 中定义的。在 QNX 中,我无法找到它的定义位置。因此抛出错误: “PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP' 此处未声明(不在函数中)”。
如何解决这个问题?
【问题讨论】:
我正在将代码从 Linux 移植到 QNX 7。我的代码中的许多地方都使用了 PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP。在 Linux 中,这是在 pthread.h 中定义的。在 QNX 中,我无法找到它的定义位置。因此抛出错误: “PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP' 此处未声明(不在函数中)”。
如何解决这个问题?
【问题讨论】:
/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>
【讨论】:
虽然递归互斥锁在 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() 开头为每个互斥锁调用的函数来初始化它们。
【讨论】: