当前位置: 首页 > news >正文

fork中的死锁问题

背景

当我们通过fork去创建子进程时,当父/子进程都涉及到锁的操作,可能会产生死锁。

代码样例

#include <iostream>
#include <mutex>
#include <unistd.h>
std::mutex m;
int main() {std::cout << "main process begin" << std::endl;m.lock();int pid = fork();if (pid == -1) {std::cout << "fork failed" << std::endl;return -1;}if(pid == 0){ // 子进程m.lock();std::cout << "child process run" << std::endl;} else {}m.unlock();while (true) {}return 0;
}

代码示例中,父进程持有锁m,然后通过fork进行进程的创建,这个时候子进程里也进行锁操作,这个时候子进程就会死锁在这里

根因

当我们通过fork创建子进程时,进程会继承父进程的内存空间(写时复制技术,copy-on-write),包括代码段,堆栈,堆和数据段。
在子进程中锁定m时,这个时候从父进程里继承的m的锁状态处于锁定状态,这是再去m.lock,那就会死锁。

一些解决方法

如果子进程能够访问到锁,那锁定前先解锁

    if(pid == 0){ // 子进程m.unlock(); // 锁定前,先解锁m.lock();std::cout << "child process run" << std::endl;} else {}

如果子进程不方便访问到锁,使用 pthread_atfork()

std::mutex m;
void child() {m.unlock();
}
int main() {pthread_atfork(nullptr, nullptr, child); //  三个参数分别时,prepare,parent,child
}
  • prepare 处理器在 fork() 调用之前执行,通常用于获取那些需要在 fork() 期间保持的锁。
  • parent 处理器在 fork() 调用之后,在父进程中执行,通常用于释放 prepare 处理器中获取的锁。
  • child 处理器在 fork() 调用之后,在子进程中执行,也通常用于释放 prepare 处理器中获取的锁。

总结

  1. 我们要尽量在多线程程序中使用fork()
  2. 使用fork()后立即调用exec()
  3. 避免在持有锁时调用fork()
    当然当我们编写多进程大型程序时,很难避免,特别是引用了一些三方库这些不受控的代码

相关文章:

fork中的死锁问题

背景 当我们通过fork去创建子进程时&#xff0c;当父/子进程都涉及到锁的操作&#xff0c;可能会产生死锁。 代码样例 #include <iostream> #include <mutex> #include <unistd.h> std::mutex m; int main() {std::cout << "main process begi…...

Java面试题———SpringBoot篇

目录 1、项目中为什么选择SpringBoot 2、SpringBoot的自动装配原理 3、SpringBoot的核心注解是哪个 4、SpringBoot中的starter是干什么的 5、SpringBoot可以有哪些方式加载配置 6、bootstrap.yml和application.yml有何区别 7、SpringBoot读取配置的方式有几种 8、Spring…...

模块化沙箱:构建零信任架构的关键技术

在数字化时代&#xff0c;数据安全成为了企业和机构关注的焦点。模块化沙箱作为一种创新的数据安全解决方案&#xff0c;正逐渐成为保护敏感信息的有力工具。深信达模块化沙箱&#xff0c;凭借其高灵活性和高扩展性&#xff0c;为不同安全需求提供了定制化的解决方案。 模块化沙…...

10.14学习日志

一.矩阵 接上篇 11.伴随矩阵 设 A 是一个 nn 的方阵&#xff0c;其元素为 aij。伴随矩阵 adj(A)或A* 是一个 nn的矩阵&#xff0c;其第 i 行第 j 列的元素是 A 的余子式 Mji 的代数余子式 Cji&#xff0c;即&#xff1a; 其中 Mji是 A 的第j 行第i 列元素的余子式&#xff0…...

“我们为什么缺少科学精神”演讲内容拆解

演讲人张双南&#xff0c;视频链接&#xff1a; https://tv.cctv.com/2017/04/23/VIDEdqzdpmxStYXAmYBdgDP7170423.shtml...

openpyxl 3.0.7 中文教程

openpyxl 3.0.7 中文教程 python Execl 处理库教程 https://openpyxl-chinese-docs.readthedocs.io/zh-cn/latest/tutorial.html#id2 案例&#xff1a; 生成表格&#xff0c;设置单元格样式 from openpyxl import Workbook from openpyxl.styles import Font, Border, Side, …...

idea开发工具使用

idea开发工具使用 1.idea下载 2.idea设置 字体 编码格式 换行 忽略大小写 自动导包 各方法之间加横线 3.快捷键 4.导入工程 5.安装scala插件 6.运行代码 7.导入jar包 8.git托管 9.打jar包...

Android map 获取值

Android Map 获取值的完整指南 在Android开发中&#xff0c;使用Map&#xff08;映射&#xff09;来存储和检索数据是非常常见的需求。Map是一种键值对集合&#xff0c;能够快速而高效地根据特定的键获取值。在这篇文章中&#xff0c;我们将深入探讨如何在Android应用中使用Ma…...

Leetcode.13 罗马数字转整数

关键词&#xff1a;to_string, string.size(), string.length() 1.题目 2.解答思路及解答 解答思路&#xff1a; 首先&#xff0c;罗马数字表达中和常规数学表达类似&#xff0c;基本是按照从后往前&#xff0c;从小到大排列。因此&#xff0c;理论上只需要从后往前相加即可。…...

骨架提取(持续更新)

一 什么是骨架提取 1.1 简介 骨架提取是图像处理或计算机视觉中的一种技术&#xff0c;用于从二值化图像中提取物体的中心线或轮廓&#xff0c;通常称为“骨架”或“细化图像”。这一技术主要用于简化形状表示&#xff0c;同时保留物体的拓扑结构。 这里我们强调了&#xff…...

B3622 枚举子集

1. 注意dfs内&#xff0c;for循环的遍历&#xff0c;想清楚把什么赋值给a[x] 2.本题只需要把0或1赋值给a[x]所以 #include<bits/stdc.h> using namespace std; int n; int a[20]; int vis[20]; void pr() {for (int i 1; i < n; i) {if (a[i] 0)cout << N;els…...

git submodule add用法

背景 介绍 git submodule add 命令用于将一个 Git 仓库作为子模块添加到另一个 Git 仓库中。子模块是一个独立的 Git 仓库&#xff0c;但它被嵌套在另一个 Git 仓库中&#xff0c;并且可以通过主仓库进行管理。当你需要在主项目中引用另一个项目&#xff08;子模块&#xff09…...

计算机毕业设计 基于Python的汽车销售管理系统的设计与实现 Python毕业设计 Python毕业设计选题【附源码+安装调试】

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…...

主流的安全测试工具知识点

1. 静态应用安全测试&#xff08;SAST&#xff09;工具 工具示例: SonarQube: 支持多种编程语言的代码质量和安全分析。Checkmarx: 提供全面的代码扫描和漏洞检测。知识点: 分析源代码或二进制代码以发现潜在的安全漏洞。早期发现和修复代码中的安全问题&#xff0c;减少修复成…...

如何接入实时期货行情数据 - 2024最新教程

期货市场通过标准化合约的交易&#xff0c;为投资者提供了在大宗商品、金融工具等方面进行风险对冲和投机的机会。量化交易以计算机模型为核心&#xff0c;通过历史数据和实时数据进行分析和策略执行&#xff0c;减少人为情绪对交易的干扰。由于期货市场的波动性强且价格变化迅…...

通义灵码:AI 编码的强大助力

一、通义灵码简介 通义灵码是阿里云推出的智能编码辅助工具&#xff0c;以通义大模型为基础&#xff0c;提供多种强大功能助力开发者高效编码。 通义灵码集成了行级 / 函数级实时续写、自然语言生成代码、单元测试生成、代码注释生成、代码解释、研发智能问答、异常报错排查等…...

docker 容器启动详解

1.启动容器 示例 1&#xff1a;启动一个复杂的 Web 应用容器 docker run -d \ -p 8080:80 \ -v /data/webapp:/app \ -e APP_ENVproduction \ -e DB_HOSTdb.example.com \ -it \ --network my_network \ --name webapp_container \ --restart always \ --memory 1g \ --cpu-sh…...

【spring ai】java 实现RAG检索增强,超快速入门

rag 需求产生的背景介绍&#xff1a; 在使用大模型时&#xff0c;一个常见的问题是模型会产生幻觉&#xff08;即生成的内容与事实不符&#xff09;&#xff0c;同时由于缺乏企业内部数据的支持&#xff0c;导致其回答往往不够精准和具体&#xff0c;偏向于泛泛而谈。这些问题…...

【Java SE 题库】递归的魅力之--> 汉诺塔问题

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 目录 1. 题目 2. 分析 2.1 图解 2.2 代码解析 3. 完整代码 3.1 运行截图 4. 小结 1. 题目 汉诺塔问题是一个经典的递归问题&#xff0c;源自一个古老的印度传…...

《为什么要在三层交换机 VLAN 上配置 IP 地址?》

如果在三层交换机上划分了 VLAN10 和 VLAN20 但没有给 IP 地址的情况下&#xff0c;只有相同 VLAN 的端口之间才能相互通信。 这是因为在没有为 VLAN 配置 IP 地址&#xff08;即没有创建 SVI&#xff0c;交换虚拟接口&#xff09;时&#xff0c;三层交换机仅作为一个二层设备…...

Qwen3-ASR-0.6B与LaTeX集成:学术语音笔记系统

Qwen3-ASR-0.6B与LaTeX集成&#xff1a;学术语音笔记系统 1. 引言 学术研究工作中&#xff0c;记录和整理笔记是每个研究者都要面对的重要任务。无论是参加学术会议、听讲座&#xff0c;还是记录自己的研究思路&#xff0c;传统的手写或打字方式往往效率不高&#xff0c;特别…...

Squeezer安全最佳实践:保护区块链dApp的10个关键点

Squeezer安全最佳实践&#xff1a;保护区块链dApp的10个关键点 【免费下载链接】squeezer Squeezer Framework - Build serverless dApps 项目地址: https://gitcode.com/gh_mirrors/sq/squeezer Squeezer Framework作为构建无服务器区块链去中心化应用&#xff08;dApp…...

如何实现ElasticHQ与ElasticSearch 8.x的完美兼容:未来就绪的监控解决方案

如何实现ElasticHQ与ElasticSearch 8.x的完美兼容&#xff1a;未来就绪的监控解决方案 【免费下载链接】elasticsearch-HQ Monitoring and Management Web Application for ElasticSearch instances and clusters. 项目地址: https://gitcode.com/gh_mirrors/el/elasticsearc…...

【无线通信】基于统计信道的低复杂度旋转和位置优化为6D可移动天线无线通信附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和…...

Python自动化办公:3种PDF水印处理技巧(附完整代码)

Python自动化办公&#xff1a;3种PDF水印处理技巧&#xff08;附完整代码&#xff09; 在数字化办公场景中&#xff0c;PDF文档的水印处理已成为高频需求。无论是合同归档需要添加版权标识&#xff0c;还是内部文件流转需清除敏感标记&#xff0c;传统手动操作既耗时又易出错。…...

谷歌DeepMind与卡内基梅隆大学揭秘声音背后的脸

这项由谷歌DeepMind与卡内基梅隆大学联合开展的研究&#xff0c;发表于2024年的计算机视觉与模式识别顶级会议CVPR&#xff08;IEEE/CVF Conference on Computer Vision and Pattern Recognition&#xff09;&#xff0c;论文编号为arXiv:2404.01975&#xff0c;有兴趣深入了解…...

AI教材生成大揭秘!工具选择与低查重教材编写的实用干货

在教材编写的过程中&#xff0c;许多编辑者常常会感到遗憾&#xff1a;尽管正文章节已经经过了反复打磨&#xff0c;但因为缺乏必要的配套资源&#xff0c;整体教学效果却受到影响。课后练习的设计需要具有层次感&#xff0c;但缺乏灵活的想法&#xff1b;教学课件希望能做到形…...

2026搜索量暴涨!这几款配音软件火到刷屏

如果你最近刷短视频&#xff0c;一定注意到了——声音比画面更抓人。从悬疑解说的低沉旁白&#xff0c;到小说推文的多角色演绎&#xff0c;再到带货视频的情绪播报&#xff0c;一条爆款视频的背后&#xff0c;往往藏着一款好用的配音软件。2026年&#xff0c;AI配音市场迎来爆…...

OpenClaw技能扩展实战:基于Qwen3-32B开发自定义文件处理器

OpenClaw技能扩展实战&#xff1a;基于Qwen3-32B开发自定义文件处理器 1. 为什么需要自定义文件处理器 上周处理季度数据时&#xff0c;我又遇到了那个老问题&#xff1a;手头有37个CSV文件需要清洗格式、去重合并&#xff0c;还要按日期归档。这种重复性工作既耗时又容易出错…...

零基础玩转OpenClaw:Qwen3-32B-Chat镜像云端体验指南

零基础玩转OpenClaw&#xff1a;Qwen3-32B-Chat镜像云端体验指南 1. 为什么选择云端体验OpenClaw&#xff1f; 第一次听说OpenClaw时&#xff0c;我正被各种本地部署的依赖项折磨得焦头烂额。作为一个习惯在MacBook上写代码的开发者&#xff0c;光是配置CUDA环境就让我望而却…...