4

Cでスレッドを実装する例を以下に示します:http://ramcdougal.com/threads.html。この例では、1次元配列を使用しています。動的な2次元配列が必要です。

代わりにmain()それがあったとしたら、それはどのように見えるでしょうか?int **arrayint array[ARRAYSIZE]

私の問題は、2次元配列へのポインタを構造体に渡す方法です。アイデアは、私には大きな配列があり、各スレッドはその配列の特定の領域のみを埋める必要があるということです。

どうもありがとう !

例のコードは次のとおりです。

struct ThreadData {

    int start, stop;
    int* array;

};


void* squarer(struct ThreadData* td) {


    struct ThreadData* data=(struct ThreadData*) td;
    int start=data->start;
    int stop=data->stop;
    int* array=data->array;
    int i;

    for (i=start; i<stop; i++) {
        array[i]=i*i;
    }

    return NULL;
}

int main(void) {

    int array[ARRAYSIZE];
    pthread_t thread[NUMTHREADS];
    struct ThreadData data[NUMTHREADS];
    int i;

    int tasksPerThread=(ARRAYSIZE+NUMTHREADS-1)/NUMTHREADS;

    for (i=0; i<NUMTHREADS; i++) {
        data[i].start=i*tasksPerThread;
        data[i].stop=(i+1)*tasksPerThread;
        data[i].array=array;
    }
    /* the last thread must not go past the end of the array */
    data[NUMTHREADS-1].stop=ARRAYSIZE;

    /* Launch Threads */
    for (i=0; i<NUMTHREADS; i++) {
        pthread_create(&thread[i], NULL, squarer, &data[i]);
    }

    /* Wait for Threads to Finish */
    for (i=0; i<NUMTHREADS; i++) {
        pthread_join(thread[i], NULL);
    }

    /* Display Result */
    for (i=0; i<ARRAYSIZE; i++) {
        printf("%d ", array[i]);
    }
    printf("\n");

    return 0;
}
4

2 に答える 2

4

2 次元配列を動的に割り当てるには、次のようなものを使用します。

int** array = malloc(sizeof(int*)*ARRAYSIZE);

ここでは、ポインタの配列を int に割り当てます。次に、各ポインタにメモリを割り当てる必要があります。

for(int i = 0;i<ARRAYSIZE;i++)
    array[i] = malloc(sizeof(int)*INNER_ARRAYSIZE);

次に、すべてのエントリに実際のデータを入力します。

for(int i = 0;i<ARRAYSIZE;i++)
    for(int j = 0;j<INNER_ARRAYSIZE;j++)
        array[i][j]=(i+j);//just for example

そして、2 次元配列を使用するように ThreadData 構造体を更新します。

struct ThreadData {

int start, stop;
int** twoDimArray;//note one more * here

};

そして、ここにポインタを渡すだけです:

struct ThreadData data;
data.twoDimArray = array;
data.twoDimArray[0][0] = data.twoDimArray[0][0]*data.twoDimArray[0][0]; //access element at 0,0 and square it
于 2012-11-21T10:07:14.840 に答える
1

次のように考えてください。

1 次元配列を操作する場合startstopは 1 次元空間の座標を表す 1 次元ベクトルです (また、1 次元ベクトルは整数で表すことができます。これは、元のコードで使用されているものです)。

したがって、2 次元配列では、start2stop次元ベクトルである必要があります。

struct ThreadData
{
  int start[2], stop[2];
  int **array;
}

次に、スレッド間で長方形のブロックを分割します。また、各スレッドは、ブロックの左上隅の位置を で取得し、ブロックのstart右下隅の位置を で取得しstopます。

ここに画像の説明を入力

ブロックは長方形で、背の高いストリップ (スレッドごとに 1 列)、長い (スレッドごとに 1 行)、正方形、またはその間の任意の場所にすることができます。ベンチマークによって、どの形状がより速く機能するかを判断する必要があります。

ある意味、tasksPerThread二次元も持っています。実際のタスク数は になりtasksPerThread[0] * tasksPerThread[1]ます。

于 2012-11-21T10:15:01.383 に答える