C:printf(带fork())
在下一个代码中:C:printf(带fork()),c,C,在下一个代码中: int i = 1; fork(); i=i*2; fork(); i=i*2; fork(); i=i*2; printf("%d\n", i); 为什么打印8,8,8,8,8,8,8,8,而不是1,2,2,4,4,8,8,8?fork()复制该过程,并在每个fork之前打印i。我错过了什么?因为fork在向下运行时继续执行代码。因此,每次生成更多子进程时,每个进程都将通过i=i*2运行。让它成为你所得到的,而不是你所期望的(也就是说,一旦分叉,它不会跳到街区的尽头) 关
int i = 1;
fork();
i=i*2;
fork();
i=i*2;
fork();
i=i*2;
printf("%d\n", i);
为什么打印
8,8,8,8,8,8,8,8
,而不是1,2,2,4,4,8,8,8
?fork()复制该过程,并在每个fork之前打印i。我错过了什么?因为fork在向下运行时继续执行代码。因此,每次生成更多子进程时,每个进程都将通过i=i*2运行。让它成为你所得到的,而不是你所期望的(也就是说,一旦分叉,它不会跳到街区的尽头)
关于fork的信息:每个新进程都会获得父进程堆栈的一个副本,因此在调用fork()之后,父进程和子进程的i值都相同——但它们没有相同的堆栈,只有一个副本。。。所以在一个过程中改变i的值对另一个过程没有影响
如果您想让两段并行代码共享同一内存,可以使用线程(以及堆中而不是堆栈上的内存),或者使用显式共享内存区域。给出所示代码,您应该看到八个6段(您编写的是
i=i+2;
而不是i=i*2;
)
由于每个进程遵循相同的代码路径,因此每个进程将产生相同的结果
要获得预期的结果,您必须跟踪每个fork()
是否生成父进程或子进程:
int i = 1;
if (fork())
{
i=i*2;
if (fork())
{
i=i*2;
if (fork())
i=i*2; // + --> *
}
}
printf(|%d\n", i);
我假设
fork()没有问题
操作。值得注意的是,您可以反转任何或所有条件,最终得到相同的结果。每个进程都将对i
执行相同的精确操作。您将在最后看到每个进程的相同值。它不应该像printf(“%d\n”,i)一样吗;