出于线程访问数据矩阵的目的,我需要一个所有线程都可以访问的互斥锁矩阵,以确保一次只有一个线程可以访问特定数据 (x,y)。 我知道还有其他选择,但我真正需要的是这个。 我尝试了一个全局指针,当我从客户端/用户收到数据矩阵的大小时,我分配了具有所述大小的互斥矩阵。没能成功……指向数组数组的指针……我的头爆炸了。 这是我微不足道的尝试的一个例子。
xthread_mutex ** globalPointer;
void example_init (int x, int y) {
globalPointer = (xthread_mutex_t **)malloc(sizeof(xthread_mutex_t)* x * y);
int i, j;
for(i=0; i<x; i++){
for(j=0; j<y; j++){
globalPointer[i][j] = xthread_mutex_init();
}
}
mutex init 上的 seg 错误,为什么? 如果您还可以提供一些有关如何在混合指针和数组时避免混淆的提示,我将不胜感激。下面不都一样吗?
编辑:很抱歉没有提及,但我使用的是“自定义”互斥体,xthread_mutex_init();基本上返回一个指向已分配锁的指针(使用 pthread 锁创建) 如果你没有发现任何问题,那么我猜我的错误在于那些......
/* 返回一个新的、解锁的互斥量 */
xthread_mutex_t xthread_mutex_init();
最佳答案
globalPointer = (xthread_mutex_t **)malloc(sizeof(xthread_mutex_t)* x * y);
为 x*y
互斥量分配空间。但是你不能简单地将其视为 xthread_mutex_t**
,如果你有
globalPointer[i][j]
将分配内存开始处偏移 i*sizeof(xthread_mutex_t)
字节处的 sizeof(xthread_mutex_t*)
字节解释为指针(指向xthread_mutex_t
).
一种实现你想要的方法是分配一个一维数组,
xthread_mutex_t *real_pointer = malloc(x * y *sizeof *real_pointer);
x
指向 globalPointer
的指针的空间,
globalPointer = malloc(x * sizeof *globalPointer);
然后用指向real_pointer
指向的 block 的指针填充它,
for(int i = 0; i < x; ++i) {
globalPointer[i] = realPointer + i*y;
}
另一种选择是像上面那样为x
指针分配空间到globalPointer
,然后为y
分配malloc
空间> 在一个循环中互斥这些指针中的每一个。
关于c - 具有全局访问权限的运行时定义大小互斥矩阵(C 语言),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13812827/