0

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]で何をすべきかについての手がかりを私に与えることができますか?

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;ましたがthreader、これにより、プログラムは正しく機能するようになりました。

于 2013-03-06T21:29:11.243 に答える