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

2024-06-20

众所周知,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(使用前将#替换为@)

Linux/POSIX:为什么 fork() 不分叉*所有*线程 的相关文章

  • posix 和 linux 特定函数的 C++ 包装器 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 您知道有什么好的库将 posix 和 linux 函数和结构 例如套接字或文件描述符 包装到 C 类中
  • C#:监视器 - 等待、脉冲、PulseAll

    我很难理解Wait Pulse PulseAll 他们都能避免僵局吗 如果您解释一下如何使用它们 我将不胜感激 简洁版本 lock obj 是简写Monitor Enter Monitor Exit 异常处理等 如果没有其他人拥有锁 您可以
  • gai_cancel() 需要很长时间才能成功

    我正在尝试在 C 中异步查找域 原因是我希望能够有效地添加超时期限 以防系统无法查找域 我遇到了 getaddrinfo a 命令 所以我决定尝试一下 然而 在我的机器上取消任何不会成功的 dns 查找 例如没有互联网连接时 永远不会花费少
  • 如何使用Python distutils?

    我用 python 编写了一个快速程序 将 gtk GUI 添加到 cli 程序中 我想知道如何使用 distutils 创建安装程序 因为它只是命令行应用程序的 GUI 前端 所以它只能在 nix 中工作 所以我不担心它是跨平台的 我的主
  • 很好的 C 库集合? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个很好的 ANSI C 库集合 用于处理向量 哈希映射 二进制树 字符串处理等 Try g
  • 多线程归并排序,添加额外的线程

    我在java中的多线程合并排序算法中面临一个问题 我应该将代码修改为 3 4 5 6 7 8 线程合并排序 将原始数组划分为subArrays 目前它有2subArrays 如何将原始数组拆分为 3 4 5 6 7 8subArray是为了
  • Java 中的“实现 Runnable”与“扩展线程”

    从我什么时候开始使用线程Java 我找到了这两种编写线程的方法 With 实施Runnable public class MyRunnable implements Runnable public void run Code Started
  • 流行的“易失性轮询标志”模式被打破了吗?

    假设我想使用布尔状态标志来进行线程之间的协作取消 我意识到人们最好应该使用CancellationTokenSource反而 这不是这个问题的重点 private volatile bool stopping public void Sta
  • Android 相机:线程?哪个应该做什么

    我试图弄清楚哪些线程应该在 Android 中执行哪些操作 我发现官方文档中唯一说明的是camera open 应该放入它自己的线程中 关于什么 camera startPreview camera stopPreview camera r
  • python中的多服务器监控/自动重启

    我有 2 个服务器程序 必须使用 GNU Screen 启动 我想使用基于 Python 的程序来强化这些服务器 防止崩溃 该程序启动每个屏幕会话 然后监视服务器进程 如果服务器进程崩溃 我需要 python 代码来终止无关的屏幕会话并再次
  • 使用vim,如何快速刷新正在处理的网页?

    我已经使用 VIM 几个星期了 同时处理各种网络语言 我真的很喜欢它 我发现必须点击或单击浏览器并刷新页面才能看到代码更改的效果 这很麻烦 更烦人的是 因为我使用的是 Virtual Box 而且我倾向于在主机系统上处理 PDF 文件 因此
  • 当我执行 pip --version 时,它显示错误为 ImportError:没有名为 pyparsing 的模块

    我尝试安装 卸载py解析以及它不起作用 我被这个问题困住了 我还必须安装额外的库 这是错误消息 Traceback most recent call last File usr bin pip line 5 in
  • 如何防止 Parallel.ForEach 循环在运行时更改任务数量?

    我正在使用Parallel ForEach循环做一些工作 我用localInit像这样 localInit gt new foo new Foo bars CreateBars 根据文档 https learn microsoft com
  • ulimit -r 返回不同的值

    我将以下两行添加到系统范围的 etc security limits conf 中 soft rtprio 55 hard rtprio 55 系统重新启动后 根据我在计算机上访问用户帐户的方式 我会得到两个不同的结果 user clien
  • top命令的CPU使用率计算

    我正在尝试使用 GNU coreutil top 的公式来计算 CPU 使用率的百分比 但 top 正在使用一些 half total 来计算百分比 即在百分比上添加 0 5 在top的utils c中 以下行 在 3 8 beta1 中
  • 无法声明接口:资源繁忙

    我正在使用 USB4Java 低级版本 并且基本上是根据这段代码工作的here http www mets blog com java usb communication usb4java 我在 Ubuntu 中工作 遇到了有关权限的问题
  • Java中RandomAccessFile的并发

    我正在创建一个RandomAccessFile对象通过多个线程写入文件 在 SSD 上 每个线程都尝试在文件中的特定位置写入直接字节缓冲区 并且我确保线程写入的位置不会与另一个线程重叠 file getChannel write buffe
  • Linux 堆栈大小

    我正在寻找 Linux 内核中堆栈的良好描述 但我发现找到任何有用的东西出奇地困难 我知道大多数系统的堆栈限制为 4k 而其他系统则限制为 8k 我假设每个内核线程 下半部分都有自己的堆栈 我还听说 如果中断发生 它会使用当前线程的堆栈 但
  • Python 队列 get()/task_done() 问题

    我的消费者端队列 m queue get queue task done
  • 当另一个线程可能设置共享布尔标志(最多一次)时,是否可以读取共享布尔标志而不锁定它?

    我希望我的线程能够更优雅地关闭 因此我尝试实现一个简单的信号机制 我不认为我想要一个完全事件驱动的线程 所以我有一个工作人员有一种方法可以使用关键部分优雅地停止它Monitor 相当于C lock我相信 绘图线程 h class Drawi

随机推荐

  • 逻辑回归/二项式的 glmnet 误差

    当尝试将 glmnet 与 family binomial 配合以进行逻辑回归拟合时 出现此错误 gt data lt read csv DAFMM HE16 matrix csv header F gt x lt as data fram
  • Flink:Jobmanager UI 中设置的并行度与任务槽有何关系?

    假设我有 8 个任务管理器和 16 个任务槽 如果我使用 Jobmanager UI 提交作业并将并行度设置为 8 我是否只使用 8 个任务槽 如果我有 8 个具有 8 个槽位的任务管理器 并以并行度 8 提交相同的作业 该怎么办 是完全一
  • 如何检查PHP变量是否包含非数字?

    我只是想知道检查 PHP 变量中是否有非数字的方法以及它是否也检测字符之间的空格 需要确保我的表单字段中没有添加任何奇怪的内容 提前致谢 如果您的意思是您只想要一个包含数字的值 那么您可以使用ctype digit http php net
  • MySQL/PDO::quote() 尽管使用 PDO::PARAM_INT 参数,但仍在整数周围加上引号

    无论我传递给什么值 数据类型对 它都会出现 pdo gt quote value type 它总是将其引用为字符串 echo pdo gt quote foo PDO PARAM STR foo as expected echo pdo g
  • Rails 如何使用 send_data 导出数据,然后重定向到新页面?

    我有一个 Rails 应用程序 允许用户下载生成的 CSV 文件 下载文件后 我想将用户重定向到新的 URL 或操作 有没有在 send data 之后进行重定向的技巧 我想做这样的事情 这不起作用 send data output typ
  • 如何从 ContentView 外部显示 SwiftUI 警报?

    我正在构建 Swift 应用程序 并试图找出如何显示警报 我有一个单独的 swift 文件正在执行一些计算 并且在某些条件下我希望它向用户显示警报 基本上告诉他们出了问题 然而 我见过的大多数例子都要求警报在ContentView或以其他方
  • 使用 gdb 调试 Linux 内核模块

    我想知道 API 在内核模块 中返回什么 从几种形式可以知道 这并不是那么简单 我们需要加载符号表来调试内核模块 所以我所做的就是 1 尝试找到内核模块的 text bss和 data段地址 2 在 gdb 中使用 add symbol f
  • 在 php 中为类自动生成 getter 和 setter 的最佳方法是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我经常创建一个包含一些私有变量的类 当设置此类的实例时 应该可以使用 getter 和 setter 填充该类的所有变量 有没有一种简单的方法可
  • 与 XGBoost gridsearch rating='roc_auc' 和 roc_auc_score 不同的 roc_auc 吗?

    我使用 GridSearch 来解决分类问题 A parameter grid for XGBoost params min child weight 1 5 10 gamma 0 5 1 1 5 2 5 subsample 0 6 0 8
  • 如何使用 Vapor 和 Leaf 将图像从浏览器上传到 Amazon S3?

    我已经设置了 AWS S3 存储桶 并且可以使用 Vapor 3 和 Postman 上传文件 PUT request 和标头 x amz acl public read 但我想从浏览器中执行此操作 我使用的是 leaf 那么如何从浏览器上
  • 当值相同时,为什么我的值比较返回 false?

    我有一个 perl 脚本 可以将 Excel XLS 文件中的数据加载到数据库中 首先 它检查文件中的值的日期时间是否已存在于数据库中 如果是 它会检查文件中的值是否与数据库中的值相同 如果它们相同 则跳过该值 如果不同 则更新数据库中的值
  • 如何确保代码被正确重用? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通常 当我们在应用程序中引入新功能时 我们可能会产生工件 例如可以在应用程序的其他区域中重用的有用方法或类 这些工件不一定被记录为功能需求 因为
  • NSPoint/NSRect 来自 NSTextView 中的字符

    所以我试图获取与 NSTextView 中特定字符的位置相对应的 NSPoint 或 NSRect 这就是我到目前为止所拥有的 效果不是很好 结果似乎有点不可预测 NSRange theTextRange theTextView layou
  • 如何处理后退按钮以转到特定片段?

    我用带片段的导航抽屉制作项目 导航有 3 个片段 我有问题 当我在第三个片段时 我按下后退按钮 应用程序突然关闭 但我想做的是将片段从第三个片段更改为第一个片段 我怎样才能做到这一点 这是我的 MainActivity 代码 public
  • 为什么不触发 .PHONY 隐式模式规则?

    我有以下递归生成文件 PHONY all clean subdir MAKE C src MAKE C dict all all subdir clean clean subdir 它工作正常 make all make C src all
  • NativeScript 中 DIV 的替代方案是什么?

    NativeScript 中 DIV 的替代方案是什么 如何使用内嵌内容的块 在浏览器内的行为div是由displayCSS 属性 例如 默认情况下是block和垂直类似于StackLayout with orientation set t
  •  
    标记内删除

    我制作了简单的 BBCode 脚本 一切正常 但后来我使用了一个 javascript 库来美化我的代码 pre pre 现在我面临的唯一问题是 br 每行代码后面的标签 pre pre tags 所以问题是我怎样才能删除 br 标记哪些在
  • 使用 Cypher 复制不同类型的关系

    我想将现有关系复制到新节点 所有节点都已存在 我想将所有传入关系复制到第二个节点 给定一个节点D和一个像这样的图表 A r gt B lt s C 我想在单个 Cypher 查询中创建以下内容 A r gt B lt s C A r gt
  • com.couchbase.client.java.query.dsl.Sort 问题的解决方案是什么?

    这是获取类的错误之一 import com bookingsite acme config document paymentoption PaymentGatewayConfiguration import com bookingsite
  • Linux/POSIX:为什么 fork() 不分叉*所有*线程

    众所周知 POSIX下创建新进程的默认方式是使用fork 在 Linux 下 这在内部映射到clone 我想知道的是 众所周知 当一个人打电话时fork 子进程是用单个线程创建的 调用的线程fork cf https linux die n