在子进程内创建线程

时间:2012-05-02 12:58:03

标签: c multithreading pthreads

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

2 个答案:

答案 0 :(得分:1)

  

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

没有。如果父母的记忆,子进程可以被认为是副本。因此,父母无法看到孩子所做的任何更改。

  

所以输出将是5和0?

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

答案 1 :(得分:1)

这是怎么回事:

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

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