【问题标题】:PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP Error in QNX 7QNX 7 中的 PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP 错误
【发布时间】:2018-11-22 11:39:35
【问题描述】:

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

如何解决这个问题?

【问题讨论】:

    标签: linux pthreads qnx


    【解决方案1】:
    /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>
    

    【讨论】:

    • #define _GNU_SOURCE
    【解决方案2】:

    虽然递归互斥锁在 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() 开头为每个互斥锁调用的函数来初始化它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多