0

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; 
}

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

4

1 回答 1

1

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

此外,我还必须更改d[i].C = &A;d[i].C = A;in threader,我这样做了,现在程序可以正常运行。

于 2013-03-06T21:29:11.243 回答