0

pthread_join() を使用すると、それが適切な場所にあるかどうかわかりません。現在のように、スレッドが終了するのを待ってから、ループを再度反復しますか? 私が求めているのは、二重の for ループから取り出して、pthread_join() の直後に新しい for ループを作成する必要があるということですか?

PS: 私は一般的なスレッドと C 言語に非常に慣れていません。また、malloc の解放に関する別の質問があります (コード内のコメント)。内部 for ループの各反復後に malloc 結果ポインターがなくなるため、 free キーワードをどこで使用するかわかりません。

これが私のコードです。これは、事前定義された 2 つの行列 (A&B) の行列乗算用です。(これは、先生が私たちにそうしてほしかった方法です)。

#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>

#define M 3 
#define K 2  
#define N 3 

int A[M][K] = {{1,4}, {2,5}, {3,6}}; 
int B[K][N] =  {{8,7,6}, {5,4,3}}; 
int C[M][N]; 

struct coords 
{ 
    int  i ;  /*  row  */       
    int  j ;  /*  column  */ 
}; 

//thread function
void* calc_val(void* resultCoords)
{
    int n, result = 0;
    struct coords **matCoords = (struct coords**) resultCoords;
    for(n = 0; n < K; n++)
    {
        result += A[(*matCoords)->i][n] * B[n][(*matCoords)->j];
    }
    C[(*matCoords)->i][(*matCoords)->j] = result;
    // One more question: 
    // <- Should I free mem from malloc here? 
}

int main(int argc, char** argv) 
{
    int numThreads = M * N, threadIndex = 0, i, j;
    pthread_t threads[numThreads];
    pthread_attr_t attributes[numThreads];
    for (i = 0; i < M; i++)
    {
        for(j = 0; j < N; j++)
        {
            struct coords *data = (struct coords*)malloc(sizeof(struct coords));
            data->i = i;
            data->j = j;
            pthread_attr_init(&attributes[threadIndex]);
            pthread_create(
                    &threads[threadIndex],
                    &attributes[threadIndex],
                    calc_val, 
                    &data);
            pthread_join(threads[threadIndex], NULL); // <-Main Question
            threadIndex++;
        }
    }

    /* ... */

    return (EXIT_SUCCESS);
}
4

1 に答える 1

0

コードでは、基本的に次のことを行います。

  1. スレッド用のデータを準備する
  2. 実行スレッド
  3. 終わるまで待って
  4. 次の反復に進む

したがって、このコードは完全にシーケンシャルです

非順次にするには、次のようなものが必要です。

  1. いくつかのデータを準備する
  2. 実行スレッド
  3. 次の反復に進む
  4. すべてのスレッドが終了するまで待ちます

このようなことを試してください:

   for (i = 0; i < M; i++)
   {
        for(j = 0; j < N; j++)
        {
            struct coords *data = (struct coords*)malloc(sizeof(struct coords));
            data->i = i;
            data->j = j;
            pthread_attr_init(&attributes[threadIndex]);
            pthread_create(&threads[threadIndex], &attributes[threadIndex], calc_val, &data);
            threadIndex++;
        }
    }
    for (i=0;i<numThreads;i++)
        pthread_join(threads[i], NULL);

メモリ割り当てに関する次の問題-すべてのスレッドが終了したときに行うことができます(その後、割り当てられたすべてのポインターをどこかに保存する必要があります)、またはコメントで尋ねたように、各スレッドを解放することができます

于 2013-10-12T00:15:45.180 に答える