0

私はこのコードを見ています:

/* 04-join.c

Simple illustration of dividing work among two threads

pthread.h should be first otherwise compile with -D_THREAD_SAFE 
*/
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

typedef struct {
   int *ar;
   long n;
   int id;
   int sum;
} subarray;


void *incer(void *arg) {
  long i;
   int id = ((subarray*)arg)->id;

   printf("Start thread: %d sum=%ld\n",id, ((subarray*)arg)->sum);
   for (i = 0; i < ((subarray*)arg)->n; i++) {
      ((subarray*)arg)->ar[i]++;
      ((subarray*)arg)->sum++;
   }
   printf("Terminating thread: %d sum=%ld\n",id, ((subarray*)arg)->sum);
   pthread_exit(NULL);
}

int main() {
   int ar[1000000];
   pthread_t th1, th2;
   subarray sb1, sb2;

   sb1.ar = &ar[0];
   sb1.n  = 500000;
   sb1.id = 1;
   sb1.sum = 0;
   pthread_create(&th1, NULL, incer, &sb1);

   sb2.ar = &ar[500000];
   sb2.n  = 500000;
   sb2.id = 2;
   sb2.sum = 0;
   pthread_create(&th2, NULL, incer, &sb2);

   pthread_join(th1, NULL);
   pthread_join(th2, NULL);
   printf("Terminating main: %d sum=%d\n",getpid(),sb1.sum+sb2.sum);
   pthread_exit(NULL);
   return 0;
}

私の質問は、forループの関数incerにあります。コードがあります

((subarray*)arg)->ar[i]++;

subarry構造体では、arは整数へのポインタですよね?では、ar [i] ++は何をするのでしょうか?なぜそれが行われているのですか?合計を増やすとともに、このスレッドによって「行われた作業」をシミュレートしていますか?

また、もう1つ小さな質問があります。インサーの前の「ボイド*」の目的は何ですか?ボイド*の重要性についての部分を見逃しました。

つまり、このポインタはincer関数のアドレスを指しているということですか。そして、関数を作成することにより、「incer」と呼ばれるvoid *が作成され、スレッドを作成するときにコードのこのセクションを参照するために使用できるので、コードのこのセクションを実行することがわかりますか?

また、なぜpthreadなのですか?プロセススレッド?

4

1 に答える 1

0

Incer は void* の戻り値の型で宣言されているため、終了時に値を返すことができます。この値は、スレッドを pthread_join することによって取得されます。戻り値はおそらくヒープに割り当てて (void*) にキャストする必要があります。この場合、pthread_join が NULL 引数で呼び出されているため、スレッドは値を返さず、メイン プロセスは戻り値を期待していません。

ar は、単一の整数へのポインターにすることができますが、整数の配列へのポインターにすることもできます。この場合、それは整数の配列です。

((subarray*)arg)->ar[i]++; インデックス i の整数を 1 ずつ増やしています。

于 2012-10-03T03:53:16.180 に答える