我正在声明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以获得良好的分配。
答案 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放在他们保护的对象中。如果您真的想要将它们从像您一样的全局池中分发出去,您需要跟踪哪些已经独立初始化它们的工作,并且具有获取一个之后初始化它们,并在将它返回池之前销毁它们的任务,由使用它们的对象的构造函数/析构函数处理。