int value = 0;
void *runner(void *param); /* the thread */
int main(int argc, char *argv[])
{
pid_t pid;
pthread_t tid;
pthread_attr_t attr;
pid = fork();
if (pid == 0) /* child process */
{
pthread_attr_init(&attr);
pthread_create(&tid,&attr,runner,NULL);
pthread_join(tid,NULL);
printf("CHILD: value = %d\n",value); /* LINE C */
}
else if (pid > 0) /* parent process */
{
wait(NULL);
printf("PARENT: value = %d\n",value); /* LINE P */
}
}
void* runner(void* param)
{
value = 5;
pthread_exit(0);
}
LINE C = 5且LINE P = 0时的值是什么?但为什么会这样?我认为这是因为子进程是父进程的副本,但子进程中发生更改的任何内容都不一定在父进程中发生更改。
在子进程中调用了转轮线程,该线程将值更改为5,然后将其打印出来。
当子进程完成时,父进程然后输出0,因为没有对该值执行任何操作。它是否正确?
答案 0 :(得分:1)
子进程写入内存的唯一时间也会使父进程的内存发生更改,即写入的内存是显式共享内存。 value
变量是常规变量(不在共享内存中)。孩子对其变量副本所做的任何事情都不会对父母的副本产生任何影响。另一方面,线程确实共享相同的内存空间,因此子代中的线程会修改子主线程可以访问的内存。
请注意,当进程分叉时,子进程只有一个线程,即使父进程是多线程的。它不是这个问题的一个因素(线程的使用与获得的结果基本相关),但是修改代码并不难以使它成为一个问题。