当前位置: 首页 > 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()
    当然当我们编写多进程大型程序时,很难避免,特别是引用了一些三方库这些不受控的代码
http://www.lryc.cn/news/460772.html

相关文章:

  • Java面试题———SpringBoot篇
  • 模块化沙箱:构建零信任架构的关键技术
  • 10.14学习日志
  • “我们为什么缺少科学精神”演讲内容拆解
  • openpyxl 3.0.7 中文教程
  • idea开发工具使用
  • Android map 获取值
  • Leetcode.13 罗马数字转整数
  • 骨架提取(持续更新)
  • B3622 枚举子集
  • git submodule add用法
  • 计算机毕业设计 基于Python的汽车销售管理系统的设计与实现 Python毕业设计 Python毕业设计选题【附源码+安装调试】
  • 主流的安全测试工具知识点
  • 如何接入实时期货行情数据 - 2024最新教程
  • 通义灵码:AI 编码的强大助力
  • docker 容器启动详解
  • 【spring ai】java 实现RAG检索增强,超快速入门
  • 【Java SE 题库】递归的魅力之--> 汉诺塔问题
  • 《为什么要在三层交换机 VLAN 上配置 IP 地址?》
  • Git的基本使用入门
  • Elasticsearch 入门
  • WebSocket 集成 Spring Boot 的实战指南
  • 无人机集群路径规划:四种优化算法(BKA、CO、PSO、PIO)求解无人机集群路径规划,提供MATLAB代码
  • 第二届 龙信杯 电子数据取证竞赛部分Writeup
  • 偷啥的都有!
  • 【中文注释】planning_scene_tutorial.cpp
  • 【Vue3】 h()函数的用法
  • Flask如何实现前后端分离项目
  • 二维码生成器 1.02.41| 一站式QR码生成器和美化工具
  • 腾讯云视立方·直播 SDK 合规使用指南