众所周知,POSIX下创建新进程的默认方式是使用fork()
(在 Linux 下,这在内部映射到clone(...)
)
我想知道的是: 众所周知,当一个人打电话时fork()
“子进程是用单个线程创建的——调用的线程fork()
"
(cf. https://linux.die.net/man/2/fork https://linux.die.net/man/2/fork)。如果例如其他线程当前持有锁,这当然可能会导致问题。对我来说,不分叉进程中存在的所有线程直观上感觉像是“泄漏抽象”。
所以我想知道:为什么只有线程调用fork()
将存在于子进程中而不是all进程的线程?这有很好的技术原因吗?
我知道在多线程分叉 https://stackoverflow.com/q/6056903/497193有一个相关的问题,但那里给出的答案并不能回答我的问题。
这两种可能性中:
-
仅线程调用fork()
继续在子进程中运行
缺点:如果另一个线程持有内部资源(例如锁),则该资源将不会被释放。
-
after fork()
,所有线程都被复制到子进程中
缺点:与外部资源交互的线程继续并行运行。如果一个线程正在将数据附加到文件:现在它会发生两次。
两者都不好,但第一个选择只会使新的子进程陷入僵局,而第二个选择会导致进程外的损坏。这可以用“糟糕”来形容。
POSIX 确实标准化了pthread_atfork
尝试在第一种情况下允许自动清理,但是它不可能工作 https://stackoverflow.com/a/6605487.
tl;dr 不要同时使用线程和叉子。使用posix_spawn
如果必须的话。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)