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