传递二维数组进行线程处理

时间:2013-03-06 07:47:16

标签: c multidimensional-array pthreads

K和THREADS任意定义如下:

#define K 1000
#define THREADS 2

假设我负责用二维数组做一些事情:

long A[K][K];

我需要将此函数和整数传递给函数的多个线程实例,因此我创建了这个结构:

typedef struct tdata {
    long *(*C)[K];
    int nt;
} tdata;

然后我按照启动POSIX线程的标准过程执行以下操作:

void threader(long A[K][K]) {    
    pthread_t p[THREADS];
    tdata d[THREADS];
    int i;

    for(i=0;i<THREADS;++i) {
        d[i].nt = i;
        d[i].C = &A;
        pthread_create(&p[i],NULL,func,&d[i]);
        pthread_join(p[i],NULL);
    }
}

然后在我的函数中,我尝试按如下方式访问上述数组:

void *func(void *arg) {
   tdata *data=arg;
   int a, b;
   ...
   for(a=0; a<K; ++a)
      for(b=0; b<K; ++b)
         long access = (*(data->C))[a][b];
   ...
   return 0; 
}

在程序seg故障和死亡之前,我最终会检索到一些不稳定的数字。我的怀疑是我在将数组传递给func方面做了一些非常错误的事情。谁能给我一个关于我应该用A [K] [K]做什么的线索?

1 个答案:

答案 0 :(得分:1)

正如cnicutar在上面的评论中提到的那样,long *(*C)[K];确实应该是long (*C)[K];并使用data->C[a][b]而不是(*(data->C))[a][b]进行访问。

此外,我还必须在d[i].C = &A;中将d[i].C = A;更改为threader,我做了,现在程序正常运行。