首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >QNX 7中的PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP错误

QNX 7中的PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP错误
EN

Stack Overflow用户
提问于 2018-11-22 19:39:36
回答 2查看 1.5K关注 0票数 1

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

如何解决这个问题?

EN

回答 2

Stack Overflow用户

发布于 2020-03-15 18:35:03

代码语言:javascript
运行
复制
/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:

代码语言:javascript
运行
复制
#define __USE_GNU
#include <pthread.h>
票数 1
EN

Stack Overflow用户

发布于 2018-11-22 20:02:09

尽管递归互斥锁在POSIX中是标准化的,但该标准并没有为它们指定一个静态初始化器(PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP是一个glibc扩展)。

这意味着为了便于移植,您需要使用pthread_mutex_init()手动初始化递归互斥锁

代码语言:javascript
运行
复制
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()开始时调用一个类似上面的函数来初始化它们。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53430194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档