众所周知,在 POSIX 下创建新进程的默认方法是使用 fork()
(在 Linux 下,这在内部映射到 clone(...)
)
我想知道的是以下内容:众所周知,当调用 fork()
时“子进程是用单个线程创建的——调用 的线程叉()
“
(参见 https://linux.die.net/man/2/fork)。如果例如其他线程当前持有锁,这当然会导致问题。对我而言,不 fork 流程中存在的所有线程在直觉上感觉就像是“有漏洞的抽象”。
所以我想知道:为什么子进程中只会存在调用fork()
的线程,而不是进程的所有个线程?这有充分的技术原因吗?
我知道在Multithreaded fork有一个相关的问题,但那里给出的答案没有回答我的问题。
最佳答案
这两种可能性:
只有调用
fork()
的线程在子进程中继续运行缺点:如果另一个线程持有内部资源(如锁),它将不会被释放。
fork()
后,所有线程都复制到子进程中缺点:与外部资源交互的线程继续并行运行。如果一个线程正在将数据附加到一个文件:现在它发生了两次。
两者都不好,但第一个选择只会死锁新的子进程,而第二个选择会导致进程外的损坏。这可以用“坏”来形容。
POSIX 确实标准化了 pthread_atfork
以尝试在第一种情况下允许自动清理,但是 it cannot possibly work .
tl;dr 不要同时使用线程和分支。如果必须,请使用 posix_spawn
。
关于Linux/POSIX : Why doesn't fork() fork *all* threads,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42034344/