【发布时间】:2017-03-03 00:20:09
【问题描述】:
我在 C 中有这个小程序
main(int argc, char **argv)
{
forkit(4);
}
void forkit(int n)
{
if(n > 0)
{
fork();
printf("%d \n", n);
forkit(n-1);
}
}
打印出来的
4 4 3 3 3 3 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
30 个数字,全部换行。但是,如果我在 printf 语句中删除 \n ,它会打印:
4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1
如果没有换行,它会给出 64 个数字。
这么小的变化怎么会产生如此不同的结果?
【问题讨论】:
-
当我运行它时:fork > out.txt && wc -l out.txt -- 我得到 64(留下换行符)
-
数字
n不在我认为的相同地址空间中。您创建的每个新流程(fork所做的)都将是您流程的一个新实例。 -
@TomDignan 也一样,无论有没有换行,我都得到 64。
-
这里有几点观察:(1)我不相信 printf 是线程安全的。您需要在此调用周围放置一个互斥锁。观察(2),每次 printf 遇到换行符都会强制刷新。这将改变你的时间特性。开始写入磁盘是切换线程的可靠方法。编辑:DigitalRoss 的解释更完整。请参考。
-
似乎取决于缓冲模式,如果我用
fflush刷新缓冲区,即使没有新行(即进程数)我也会得到 30