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]做什么的线索?
答案 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
,我做了,现在程序正常运行。