4

次の例を示す本を読みました。

int value=0
int thread_func(int id) {
   int temp;
   temp=value+id;
   printf("Thread%d value: %d", id, temp);
   value=temp;
}

int main() {
   int fork_id, status, i;
   pthread_t tids[3];
   fork_id=fork();
 if (fork_id == 0) {
   for (i=1; i≤3; i++) 
        pthread_create(&tids[i-1], NULL, thread_func, i);
      for (i=0; i≤2; i++)
        pthread_join(tids+i, &status);
      printf("Second process value: %d", value);
  }
 else {
  wait(&status);
      printf("First process value: %d", value)
      }

主な 2 つの点がわかりません。読んだところ、行に含まれる値printf("First process value: %d", value)は 0 だけです。しかし、なぜでしょうか。wait(&status) は、子プロセスが終了するまで待機します。場合によっては、すべての結合が完了した後にのみ終了します。つまり、値が 6 の場合。

第 2 に、 の行printf("Second process value: %d", value);では、値は 1 から 6 までの範囲で指定できます。結合命令があるため、これも奇妙です。

4

3 に答える 3

3

あなたの質問への答え:

  1. 親プロセスでは値が0になります。これは、fork発生すると、親のアドレス空間が(変数とともにvalue)子プロセスで複製されるためです。したがって、value子では変更されますが、これらは異なる変数であるため、この変更は親には反映されません。

  2. value同期が含まれていないため、3つの子スレッドによって変数がどの順序で変更されたかを知る方法はありません。具体的には、各スレッドには異なる値のローカルtemp変数があり、それがグローバル変数にコピーされますが、スレッドがここで上書きするvalue順序を知る方法はありません。したがって、その値は実行ごとに異なる可能性があります。valuetempvalue = temp;

于 2012-05-23T12:03:57.180 に答える
0

フォークすると、独自のメモリを備えたまったく新しいプロセスが得られるため、あるプロセスでの変数への変更が別のプロセスに表示されないことを意味します。一方、スレッドはメモリを共有します。つまり、スレッド化されたプログラムの変数への変更はすべてのスレッドに表示されます。

于 2012-05-23T12:04:36.707 に答える
0

値は子プロセスによって増分されるため、親プロセスはその値を 0 として表示します。

if(fork_id == 0){
......
......
}

スレッドを生成した子によって実行されます。

また、子プロセスには異なるメモリのコピーがあります。そのため、子の値を増やしても、親にとって同じことを意味するわけではありません。

また、スレッドはグローバル値にアクセスできます。

于 2012-05-23T12:15:03.710 に答える