2

出于线程访问数据矩阵的目的,我需要一个所有线程都可以访问的互斥体矩阵,以确保一次只有一个线程可以访问某些数据(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();
}
}

互斥量初始化上的段错误,为什么?如果您还可以提供一些关于如何在混合指针和数组时避免混淆的提示,我将不胜感激。下面不都是一样的吗?

编辑:我很抱歉没有提到,但我正在使用“自定义”互斥锁,xthread_mutex_init(); 基本上返回一个指向已分配锁的指针(使用 pthread 锁创建)如果你没有发现任何问题,那么我猜我的错误在那些......

/* 返回一个新的、未锁定的互斥体 */

xthread_mutex_t xthread_mutex_init();

4

1 回答 1

1
globalPointer = (xthread_mutex_t **)malloc(sizeof(xthread_mutex_t)* x * y);

x*y为互斥体分配空间。但是你不能简单地把它当作一个xthread_mutex_t**,如果你有

globalPointer[i][j]

sizeof(xthread_mutex_t*)它将从分配的内存开始处偏移字节的字节解释i*sizeof(xthread_mutex_t)为指针(指向 a xthread_mutex_t)。

实现您想要的一种方法是分配一个一维数组,

xthread_mutex_t *real_pointer = malloc(x * y *sizeof *real_pointer);

x指针的空间globalPointer

globalPointer = malloc(x * sizeof *globalPointer);

然后用指针填充它指向的块real_pointer

for(int i = 0; i < x; ++i) {
    globalPointer[i] = realPointer + i*y;
}

另一种选择是为上面的x指针分配空间globalPointer,然后在循环中为每个指针分配互斥体malloc空间。y

于 2012-12-11T03:00:01.687 回答