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

Ism*_* R. -22 c++ posix fork c++11

考虑到

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

"实现可以假设任何线程最终将执行以下操作之一:
- 终止,
- 调用库I/O函数,
- 访问或修改易失性对象,或
- 执行同步操作或原子操作.
[注意:这是为了允许编译器转换,例如删除空循环,即使无法证明终止也是如此. - 尾注]

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

int main(int argc, char* argv[]) {
    while ( true )
        fork();
}
Run Code Online (Sandbox Code Playgroud)

(有一些早期的讨论在(优化掉一个"while(1);"在C++ 0x中),但它似乎没有回答fork循环中调用的情况.)

Moh*_*ain 10

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

编译器无法确定此函数包含什么,并且符合条件的编译器应始终避免优化此循环,这将导致在其中一个注释中引用的fork炸弹.

为了避免后果,应该避免用户可以拥有的最大进程数.

从男人叉

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