【发布时间】:2021-07-18 16:03:17
【问题描述】:
假设我们有一个全局变量int a = 0,a会被打印多少次,第一个值和最后一个值是多少?
for(int i=0; i<6; i++){
fork();
a++;
printf("a = %d\n", a)
}
printf("a = %d\n", a);
这是我所做的:
- i=0:又创建了一个线程,所以我现在有 2 个正在运行,它们都打印(a=1,a=2),不知道哪个打印什么。
- i=1:这两个线程产生了更多的 2 个线程,所以我总共有 4 个线程,以及 (a=3,4,5,6) 的 4 个打印。
- i=3:现在有了 8,我们得到 (a=7,8,9,10,11,12,13,14)。
- 有 16 个,直到 a=30
- 使用 32,直到 a=62。
到目前为止,我在循环的一侧有2+4+8+16+32=62,并且所有进程都到达外部循环以获得额外的32个,所以我得到94总共打印a=1第一个值和a=62结束值.
我将不胜感激有关我的解决方案的任何反馈,因为我不确定如何在代码中对其进行测试,因为我无法在 Windows 中使用 fork。
提前致谢!
【问题讨论】:
-
作为未来的提示:Windows 的 WSL 功能允许 Linux 用户模式代码在 Windows 下运行。它支持分叉。
-
是时候拿出笔和纸了。绘制正在创建的进程树。开始计算每个进程的循环数(记住大多数进程不会迭代全部数量)。
-
fork 创建了一个新进程,一个完全相同的双胞胎,所有变量的副本完全相同。因此,打印输出应为 1,1,2,2,2,2,3,3,3,3,3,3,3,3...等等。哦,等等,您使用的是 Windows?里面不支持。没有线索。
-
@Someprogrammerdude Tbh 我尝试绘制树形图,但我有点困惑,从一个开始,我是否应该像 5 个箭头一样绘制 5 个进程,因为它有 5 个?然后每个过程中的4个箭头等..?这是我第一次处理这些东西,不想在错误上建立自己的理解
-
@Tarik 不要担心windows,与问题无关,但我知道fork 也会复制全局变量?就像它是一个新变量?所以 a 的最大值只有 6?