为什么`fork()`调用没有在无限循环中被优化掉?

考虑到

C ++ 11§1.10/ 24(in [intro.multithread])

实现可能会假设任何线程最终都会执行以下操作之一:
- 终止,
- 拨打图书馆I / O功能,
- 访问或修改易失性对象,或
- 执行同步操作或原子操作。
[注意:这是为了允许编译器转换,例如删除空循环,即使无法证实终止。 - 注意]

...是编译器允许优化掉以下循环:

int main(int argc, char* argv[]) {
    while ( true )
        fork();
}

(有一些前面的讨论(在C ++ 0x中优化掉“while(1);”),但它似乎没有回答循环中的fork调用的情况。)


fork是一个正常的函数,就像调用glibc fork()包装器的其他库函数一样,而不是直接调用系统调用。

编译器无法确定此函数包含的内容,并且符合标准的编译器应始终避免优化此循环,这将导致在其中一个注释中提到的fork炸弹。

为避免后果,应避免用户拥有的最大进程数量。

从人叉

从版本2.3.3开始,不是调用内核的fork()系统调用,而是作为NPTL线程实现的一部分提供的glibc fork()包装调用克隆(2),其标志提供了与传统系统调用相同的效果。 glibc包装调用已经使用pthread_atfork(3)建立的任何fork处理程序。

链接地址: http://www.djcxy.com/p/30723.html

上一篇: Why is a `fork()` call not optimized away in an infinite loop?

下一篇: Function optimized to infinite loop at 'gcc