在子进程内创建线程

#include #include 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?

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

不可以。如果父母的记忆,儿童过程可以被认为是获得副本 。 因此,父母不会看到孩子做出的任何改变。

所以输出将是5和0?

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

这是怎么回事:

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

因此,由于子项生成的线程中分配的值只能在子进程内部显示,而不能在父进程内部显示,因此结果为5和0。