KとTHREADSは、次のように任意に定義されます。
#define K 1000
#define THREADS 2
私が次のような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]で何をすべきかについての手がかりを私に与えることができますか?