的Linux/POSIX:为什么不调用fork()叉*所有*线程

问题描述:

这是众所周知的默认方式创建一个新的进程下的POSIX是用fork()(Linux下这个内部映射到clone(...)的Linux/POSIX:为什么不调用fork()叉*所有*线程

我想知道以下内容:众所周知,当您拨打fork()“子进程使用单线程创建 - 名为fork()” (参见https://linux.die.net/man/2/fork)。这当然会导致问题,例如,某个其他线程当前拥有一个锁。对我而言,不直接感觉到过程中存在的所有线程都感觉像是“漏洞抽象”。

所以我想知道:为什么只有线程调用fork()会在子进程中存在,而不是全是进程的线程?有这个好的技术理由吗?

我知道在Multithreaded fork有一个相关的问题,但给出的答案不回答我的。

这两种可能性中:

  • 只有线程调用fork()继续在子进程中运行

    缺点:如果另一个线程紧紧依靠内部资源,如锁,它会不被释放。

  • fork()后,所有线程复制到子进程

    缺点:即用外部资源进行交互线程并行继续运行。如果线程正在将数据附加到文件中:现在它发生两次。

两者都不好,但第一个选择只会死锁新的子进程,而第二个选择会导致进程外的腐败。这可能被描述为“不好”。

POSIX确实标准化了pthread_atfork以尝试在第一种情况下允许自动清理,但it cannot possibly work

tl; dr请勿使用线程和叉子。如果必须使用posix_spawn