0

次のコードがある場合 (Silberschatz、オペレーティング システムから)、行 P で値 = 0 になるのはなぜですか? 親プロセスは子が終了するまで待機し、子は値= 5を設定すると思いました。

誰かが私にこれを説明できますか?

int value = 0;
void *runner(void *param);

int main(int argc, char *argv[])
{
    int pid;
    pthread_t tid;
    pthread_attr_t attr;
    pid = fork();

    if (pid == 0) {
        pthread_attr_init(&attr);
        pthread_create(&tid,&attr,runner,NULL);
        pthread_join(tid,NULL);
        printf("CHILD: value= %d \n",value); /* LINE C */
    }
    else if (pid > 0) {
        wait(NULL);
        printf("PARENT: value= %d \n",value); /* LINE P */
    }
}

void *runner(void *param) {
    value = 5;
    pthread_exit (0);
}
4

1 に答える 1

3

フォークすると、親からのメモリのコピーを使用して、まったく新しいプロセスが作成されます。(OS はこれを高速化するためにトリックを使用する場合がありますが、セマンティクスはそのままです。)

親は、子の変数に加えられた変更を認識しません。それらは、別のメモリを持つ別のプロセスです。

一方、スレッドは同じメモリ領域を共有します。したがって、実行されたスレッドの変更はrunner、子のメイン スレッドに表示されます。

于 2012-11-10T13:21:22.363 に答える