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

标签 linux multithreading fork posix

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

相关文章:

c - Unix 服务器客户端连接 : Connection refused

linux - 如何将 NVM 用作 sudo?

c# - 创建大量任务/线程并等待它们全部完成

c - 将 fork() 替换为 pthread_create()

php - 为什么超时不工作linux服务器

linux - 如何升级 pg_dumpall

java - 原子引用用法

python - 我正在创建一个 tkinter gui,我需要将其设为一个线程。但线程不起作用

c - 为 pthread 分配内存,然后 fork + execvp

c - 为什么我的第一个子进程没有收到他 parent 的信号