考虑
C ++11§1.10/ 24([intro.multithread])“实现可能会假设任何线程最终会执行以下操作之一:
- 终止,
- 调用库I / O功能,
- 访问或修改易失性对象,或
- 执行同步操作或原子操作 [注意:这是为了允许编译器转换,例如删除空循环,即使在 终止无法证明。 - 后注]
...允许编译器优化掉以下循环:
int main(int argc, char* argv[]) {
while ( true )
fork();
}
(在(Optimizing away a "while(1);" in C++0x)有一些早期的讨论,但它似乎没有回答循环中fork
调用的情况。)
答案 0 :(得分:10)
fork
是一个普通函数,就像调用glibc fork()
包装器而不是直接调用系统调用的其他库函数一样。
编译器无法确定此函数包含的内容,并且符合条件的编译器应始终避免优化此循环,这将导致其中一条注释中引用fork bomb。
为了避免后果,应该避免用户拥有的最大进程数。
来自man fork
从版本2.3.3开始,而不是调用内核的fork()系统调用,作为一部分提供的glibc fork()包装器 NPTL线程实现调用带有标志的clone(2) 提供与传统系统调用相同的效果。 glibc包装器调用已建立的任何fork处理程序 使用pthread_atfork(3)。