5

私はCでプログラムを持っています。

pthread_createを使用して3つのスレッドを作成し、クリティカル領域をロック/ロック解除するためにミューテックスを作成しました。

pthread_createの3番目の引数は、スレッドが実行する関数へのポインターです。

私がWebで見つけた例では、この関数は 常に非常に単純です。たとえば、スレッドIDを出力したり、メッセージを出力したりします。

スレッドが実行する関数にforループが含まれているとどうなりますか?

私のプログラムでは、スレッドのそれぞれが2次元配列で動作するようにしたいと思います。

各スレッドは、2次元配列の線の合計を求めます。例えば

Thread1は、2次元配列の最初の行の合計を計算します。

Thread2は2行目の合計を計算します
Thread1は3行目の合計を計算します
Thread3は3行目の合計を計算します

スレッドの順序は気にしませんが、すべてのスレッドで1つの行を選択する必要があります。

2次元配列の2つのセルを合計する次のコードがあります。

プログラム:

  1. NTHREADSを作成します

     for(i=0; i < NTHREADS; i++)
        {
           pthread_create( &thread_id[i], NULL, CalculateSum, NULL );
        }
    
  2. 各スレッドは、他のスレッドが終了するのを待ちます

    for(j=0; j < NTHREADS; j++)
       {
          pthread_join( thread_id[j], NULL);
       }
    
  3. 各スレッドが実行する関数ですが、配列の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ループでどのように実行されるかを理解することです]

誰かが私を助けてくれたら嬉しいです

前もって感謝します

4

2 に答える 2

6

スレッドごとのパラメーターの配列を作成し、これらをスレッドに 1 つずつ渡す必要があります。あなたの場合、 への単一のポインタで十分です。スレッドに0 から までintのインデックスを渡すと、スレッドは のような行の合計を返します。threadindexNTHREADSrow % NTHREADS == threadindex

スレッド関数の外観は次のとおりです。

void *CalculateSum(void *args)
{
    int *argPtr = args;

    int i,j,sum = 0;
    int threadindex = *argPtr;

    for( i = 0; i <= N-1; i++) {
        if (i % NTHREADS != threadindex) continue;
        for( j = 0; j <= M-1; j++) {
            sum += dimensional_array[i][j];
        }
    }

    pthread_mutex_lock( &mutex1 ); Mutex must go here
    counter++;
    pthread_mutex_unlock( &mutex1 );
    // Pass the value back:
    *argPtr = sum;
}


main()
{
    pthread_t thread_id[NTHREADS];
    int thread_args[NTHREADS];
    int i, j;

    pthread_mutex_init(&mutex1, NULL);

    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++)
    {
        thread_args[i] = i;
        pthread_create( &thread_id[i], NULL, CalculateSum, &thread_args[i]);
    }

    int sum = 0;
    for(j=0; j < NTHREADS; j++)
    {
        pthread_join( thread_id[j], NULL);
        sum += thread_args[i];
    }

    printf("Final counter value: %d. Total: %d\n", counter, sum);
}
于 2012-11-16T18:48:09.470 に答える
3

1行の合計を計算するには(スレッドのものを無視します):

void *CalculateSum(void *dummyPtr)
{
    int j,sum = 0;

    int i = (int)dummyPtr;
    for( j = 0; j <= M-1; j++) {
        sum += dimensional_array[i][j];
    }
    printf(" Sum = %d\n", sum);

    pthread_mutex_lock( &mutex1 );
    counter++;
    pthread_mutex_unlock( &mutex1 );
}

そして、次のようにスレッドを作成します。

int line_number = 2;    // Or whatever line to print`enter code here`
pthread_create( &thread_id[i], NULL, CalculateSum, (void *)line_number );

編集:「counter++」を元に戻します。

于 2012-11-16T18:45:36.840 に答える