0
#include<pthread.h>
#include<stdio.h>
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",value);
}
else if(pid>0){
wait(NULL);
printf("PARENT VALUE=%d",value);
}
}


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

孩子和父母的价值是什么?孩子和它创建的线程会共享数据吗?所以输出将是 5 和 0?

4

2 回答 2

1

孩子和它创建的线程会共享数据吗?

不。如果父进程的记忆,子进程可以被认为是获取副本。因此,孩子所做的任何更改对父母都是不可见的。

所以输出将是 5 和 0?

是:子打印 5,父打印 0(不一定按此顺序)。

于 2012-05-02T13:13:35.947 回答
1

会发生什么:

  • 子进程是通过复制父进程的内存空间来创建的。它将看到与父级相同的数据,但它只是一个副本,因此它们不会相互干扰。子进程(或其任何线程!)所做的任何后续更改将只对其自身可见。
  • 子进程产生的线程与子进程的主线程共享内存空间,并且再次看到父进程中值的副本。

因此,由于在子进程产生的线程中分配的值仅在子进程内可见,而在父进程内不可见,因此结果为 5 和 0。

于 2012-05-02T13:21:38.070 回答