QNX 7中的PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP错误

时间:2018-11-22 11:39:36

标签: linux pthreads qnx

我正在将代码从Linux移植到QNX7。在我的代码的很多地方都使用了PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP。在Linux中,这是在pthread.h中定义的。在QNX中,我无法找到定义的位置。因此抛出错误: “此处未声明PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP'(不在函数中)”。

该如何解决?

2 个答案:

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