【问题标题】:creating thread inside child process [closed]在子进程中创建线程[关闭]
【发布时间】:2012-05-02 12:58:03
【问题描述】:
#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?

【问题讨论】:

  • 当你尝试时会发生什么?
  • 5 代表孩子,0 代表父母。 fork() 创建一个新进程,因此,为您提供空间隔离。
  • 很抱歉,这种问题只要运行相关代码就可以轻松搞定。我将关闭您的两个问题,请不要发布第三次。

标签: c multithreading pthreads


【解决方案1】:

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

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

所以输出将是 5 和 0?

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

【讨论】:

    【解决方案2】:

    会发生什么:

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

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

    【讨论】:

      猜你喜欢
      • 2018-10-27
      • 1970-01-01
      • 2018-08-25
      • 2020-04-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-01
      • 1970-01-01
      • 2011-12-30
      相关资源
      最近更新 更多