2012-05-02 85 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