gpt4 book ai didi

Linux/POSIX : Why doesn't fork() fork *all* threads

转载 作者:可可西里 更新时间:2023-11-01 11:52:04 28 4
gpt4 key购买 nike

众所周知,在 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com