私はCでプログラムを持っています。
pthread_createを使用して3つのスレッドを作成し、クリティカル領域をロック/ロック解除するためにミューテックスを作成しました。
pthread_createの3番目の引数は、スレッドが実行する関数へのポインターです。
私がWebで見つけた例では、この関数は 常に非常に単純です。たとえば、スレッドIDを出力したり、メッセージを出力したりします。
スレッドが実行する関数にforループが含まれているとどうなりますか?
私のプログラムでは、スレッドのそれぞれが2次元配列で動作するようにしたいと思います。
各スレッドは、2次元配列の線の合計を求めます。例えば
Thread1は、2次元配列の最初の行の合計を計算します。
Thread2は2行目の合計を計算します
Thread1は3行目の合計を計算します
Thread3は3行目の合計を計算します
スレッドの順序は気にしませんが、すべてのスレッドで1つの行を選択する必要があります。
2次元配列の2つのセルを合計する次のコードがあります。
プログラム:
NTHREADSを作成します
for(i=0; i < NTHREADS; i++) { pthread_create( &thread_id[i], NULL, CalculateSum, NULL ); }
各スレッドは、他のスレッドが終了するのを待ちます
for(j=0; j < NTHREADS; j++) { pthread_join( thread_id[j], NULL); }
各スレッドが実行する関数ですが、配列の1行に対してであり、配列全体に対してではありません。
void *CalculateSum(void *dummyPtr) { pthread_mutex_lock( &mutex1 ); int i,j,sum = 0; for( i = 0; i <= N-1; i++) { for( j = 0; j <= M-1; j++) { sum = dimensional_array[i][j] + dimensional_array[i][j]; } printf(" Sum = %d\n", sum); } counter++; pthread_mutex_unlock( &mutex1 ); }
プログラム全体は次のとおりです。プログラムにコンパイルエラーはありません。
それを実行するには、次のことを行う必要があります。gcc -pthread program.c
//program.c
#include <stdio.h>
#include <pthread.h>
#define NTHREADS 3
void *CalculateSum(void *);
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
int counter = 0;
#define N 10
#define M 10
int dimensional_array[N][M];
main()
{
pthread_t thread_id[NTHREADS];
int i, j;
for (i = 0; i <= N - 1; i++ )
for( j = 0; j <= M - 1; j++)
dimensional_array[i][j] = i;
for(i=0; i < NTHREADS; i++)
{
pthread_create( &thread_id[i], NULL, CalculateSum, NULL );
}
for(j=0; j < NTHREADS; j++)
{
pthread_join( thread_id[j], NULL);
}
printf("Final counter value: %d\n", counter);
//print ARRAY
for (i = 0; i <= N-1; i++ ) {
for( j = 0; j <= M-1; j++)
printf("%d\t",dimensional_array[i][j]);
printf("\n");
}
}
//Calculate
void *CalculateSum(void *dummyPtr)
{
pthread_mutex_lock( &mutex1 );
int i,j,sum = 0;
for( i = 0; i <= N-1; i++) {
for( j = 0; j <= M-1; j++) {
sum = dimensional_array[i][j] + dimensional_array[i][j];
}
printf(" Sum = %d\n", sum);
}
counter++;
pthread_mutex_unlock( &mutex1 );
}
だから、私は各スレッドに行の合計を見つけてもらいたいのですが、私は混乱しています、私はそれを行う方法がわかりません。
私のプログラムでは、スレッドがCalculate関数を呼び出すたびに、1つだけでなく、すべての行の合計が計算されます。
[注意:簡単にするために、最初の要素をそれ自体と合計します。重要なのは、それらのスレッドがすべてそのforループでどのように実行されるかを理解することです]
誰かが私を助けてくれたら嬉しいです
前もって感謝します