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)一样吗;