如何防止重新初始化pthread_rwlock_t

时间:2014-11-21 22:45:51

标签: c pthreads

我正在声明pthread_rwlock_t静态全局数组。 例如static pthread_rwlock_t cm [255]; 在构造函数中我想初始化255个互斥体中的一个(我用静态计数器跟踪)

现在我很困惑 1)我不想再次重新初始化锁,这很糟糕! 我认为重新初始化应该返回一些错误代码,但它不会:

#include<stdio.h>
#include <pthread.h>

static pthread_rwlock_t cm[2];

int main()
{
    int ret;
    ret = pthread_rwlock_init(&cm[0], NULL);
    ret = pthread_rwlock_wrlock(&cm[0]);
    printf("Ret: %d\n", ret);

    ret =  pthread_rwlock_init(&cm[0], NULL);
    printf("Ret: %d\n", ret);

    ret = pthread_rwlock_wrlock(&cm[0]);
    printf("Ret: %d\n", ret);
}

结果:

Ret: 0
Ret: 0
Ret: 0

任何人都可以提供帮助,1)如果可以,那怎么办? 2)如果不是什么应该是替代方法?

编辑1: 我正在通过我得到的评论/答案进行更新:

  
    
      

相反,只需将rwlock放在他们保护的对象中。       所以我有n个对象被调用,并将使用那么多pthread_lock ..所以缺点是内存。因此,我试图用全局锁定数组来改进那部分。挑选256以获得良好的分配。

    
  

2 个答案:

答案 0 :(得分:1)

如果您需要静态初始化,请在阵列上使用PTHREAD_RWLOCK_INITIALIZER。

static pthread_rwlock_t cm[2] = { PTHREAD_RWLOCK_INITIALIZER , 
                                  PTHREAD_RWLOCK_INITIALIZER} ;

这相当于在attr参数指定为NULL的每个元素上调用pthread_rwlock_init(),除了不执行错误检查。

答案 1 :(得分:1)

在同一个对象上多次调用pthread_rwlock_init(或者类似于任何pthread原语初始化函数)的未定义行为,从逻辑上讲,它没有任何意义无论如何这样做(因为你已经证明)该对象已经在使用中。你在2501的回答评论中说你不能使用pthread_once,但这没有任何意义。如果您能够拨打pthread_rwlock_init,则可以使用执行pthread_once调用的初始化函数来调用pthread_rwlock_init

但我真的认为您正在体验XY problem。维持一个全球性的游泳池是没有意义的。 rwlocks并在构造函数中动态地发布它们。相反,只需将rwlock放在他们保护的对象中。如果您真的想要将它们从像您一样的全局池中分发出去,您需要跟踪哪些已经独立初始化它们的工作,并且具有获取一个之后初始化它们,并在将它返回池之前销毁它们的任务,由使用它们的对象的构造函数/析构函数处理。