2012-05-02 52 views
1
#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?在子进程内创建线程

+1

会发生什么它? –

+0

5为孩子,0为父母。 fork()创建一个新进程,并因此给你空间隔离。 –

+0

你试过了吗? –

回答

1

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

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

所以输出将是5和0?

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

1

会发生什么情况是这样的:通过复制母的内存空间中创建

  • 子进程。它会看到与父母相同的数据,但它只是一个副本,所以它们不能互相干扰。由子进程(或其任何线程!)完成的任何后续更改将仅对其本身可见。
  • 由子进程生成的线程与子进程的主线程共享内存空间,并再次在父进程中查看这些值的副本。

因此,因为由儿童催生了线程分配的值才会子进程中可见的,但不是父进程中,结果是5,当你尝试0