如果我有以下代码(来自 Silberschatz,操作系统),为什么 P 行中的值变为 0?我以为父进程等到子进程完成,子进程设置 value = 5。
有人能给我解释一下吗?
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 \n",value); /* LINE C */
}
else if (pid > 0) {
wait(NULL);
printf("PARENT: value= %d \n",value); /* LINE P */
}
}
void *runner(void *param) {
value = 5;
pthread_exit (0);
}
最佳答案
当您 fork 时,您创建了一个全新的进程,其中包含来自父进程的内存的副本。 (操作系统可能会使用技巧来加快速度,但语义仍然存在。)
父级看不到对子级变量所做的更改 - 它们是具有独立内存的独立进程。
另一方面,线程共享相同的内存区域。因此,运行 runner
的线程中的更改对于子线程的主线程是可见的。
关于c - fork() 和 wait()/父/子更改的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13322378/