Linux mmap+shm_open+进程互斥锁实现共享内存通信
发布日期:2021-05-10 05:07:19 浏览次数:23 分类:精选文章

本文共 1178 字,大约阅读时间需要 3 分钟。

项目实践与进程互斥锁实现

本文将详细介绍如何在多线程环境下实现进程互斥锁,并探讨如何处理进程异常未解锁的情况。通过实际编码与测试,验证互斥锁的正确性与程序的健壮性。

一、初步实现与编译运行

  • ProcessA.c

    • 编译命令gcc ProcessA.c -o ProcessA -lrt
    • 运行命令./ProcessA
    • 代码逻辑
      通过shm_open创建共享内存段,使用pthread_mutex_t实现互斥锁机制。程序中定义了共享内存结构体sharedmemory,包含互斥锁和数据域。初始时通过write函数向共享文件中写入临时内容,避免因文件操作失败导致bus总线错误。接着,初始化数据域并在循环中使用互斥锁保护的对数据域进行操作。
  • ProcessB.c

    • 编译命令gcc ProcessB.c -o ProcessB -lrt
    • 运行命令./ProcessB
    • 代码逻辑
      与ProcessA类似,ProcessB亦通过shm_open创建共享内存段,但其对数据域的修改位置和内容有所不同。ProcessA主要修改前10个元素,ProcessB则修改后10个元素。
  • 二、进程互斥锁与异常处理

    为了确保多线程环境下的程序健壮性,特别是在进程异常未解锁的情况下,需要对互斥锁进行适当处理。

  • 异常处理机制

    • 在互斥锁初始化时,设置其为PROCESS_SHARED属性,使得其他进程能够访问该锁。
    • 使用PTHREAD_MUTEX_ROBUST属性,允许在进程异常退出时自动恢复锁的状态。
    • 在加锁时,检查返回值是否为EOWNERDEAD,若为此值,调用pthread_mutex_consistent函数更换锁的属主,避免死锁。
    • 若返回值为ENOTRECOVERABLE,则销毁当前锁并重新初始化,确保锁状态的一致性。
  • 异常处理后的效果

    • 在进程异常退出时,互斥锁会被自动更换或销毁,防止其他进程因无法获取锁而导致死锁或崩溃。
    • 这种机制使得程序在多进程环境下表现更为稳定,避免因进程异常导致系统资源泄漏或不响应。
  • 三、测试与验证

    通过实际编译与运行可发现,ProcessA和ProcessB在默认情况下能够正常工作。由于互斥锁的保护,数据域不会被其他进程随意修改,确保了数据的完整性与一致性。

    在测试异常处理机制时,若某个进程异常退出未解锁,系统会自动更换锁的属主或销毁锁,防止其他进程因无法获取锁而导致的问题。这种机制尤其在多线程环境下表现出色,确保了程序的健壮性。

    四、总结与展望

    通过本次实践,掌握了如何在多线程环境下使用互斥锁实现共享内存的安全访问。同时,通过引入异常处理机制,确保了进程间的互斥锁不会因进程异常导致系统崩溃或资源泄漏。

    未来的工作可以进一步优化互斥锁的性能表现,探索更高效的锁机制,或者结合其他同步机制(如信号量)实现更复杂的多线程控制。

    上一篇:Ubuntu下创建虚拟调试串口
    下一篇:周立功开发板 EPC-6G2C-L Qt qmake编译

    发表评论

    最新留言

    第一次来,支持一个
    [***.219.124.196]2025年05月08日 14时35分59秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章

    Kubernetes学习总结(16)—— Kubernetes 实战之部署 Redis 集群 2025-04-03
    Kubernetes学习总结(17)—— Kubernetes 快速入门需要掌握的知识点总结 2025-04-03
    Kubernetes学习总结(18)—— Kubernetes 容器网络 2025-04-03
    Kubernetes学习总结(1)——Kubernetes入门简介 2025-04-03
    Kubernetes学习总结(2)——Kubernetes设计架构 2025-04-03
    Kubernetes学习总结(3)——一年时间打造全球最大规模之一的Kubernetes集群,蚂蚁金服怎么做到的? 2025-04-03
    Kubernetes学习总结(4)——Kubernetes v1.20 重磅发布 | 新版本核心主题 & 主要变化解读 2025-04-03
    Kubernetes学习总结(5)——Kubernetes 常见面试题汇总 2025-04-03
    Kubernetes学习总结(6)——Kubernetes 7周年:它为什么如此受欢迎? 2025-04-03
    Kubernetes学习总结(7)——学习 Kubernetes 的 Pod 2025-04-03
    Kubernetes学习总结(8)—— Kubernetes Pod 资源管理 和 Pod 服务质量 2025-04-03
    Kubernetes学习总结(9)—— 基础架构的未来是 K8s,那么 K8s 的未来在何方? 2025-04-03
    kubernetes实战(十三):k8s使用helm持久化部署harbor集成openLDAP登录 2025-04-03
    Kubernetes实战(一)-Kubernetes集群搭建 2025-04-03
    Kubernetes实战(七)-优先级调度(Pod Priority Preemption) 2025-04-03
    Kubernetes实战(三十一)-Calico网络部署(推荐) 2025-04-03
    Kubernetes实战(三十三)-外部Etcd集群部署与调优(更安全的数据存储策略) 2025-04-03
    Kubernetes实战(三十二)-Kubeadm 安装 Kubernetes v1.24.0 2025-04-03
    Kubernetes实战(三)-定向调度(NodeSelector) 2025-04-03
    Kubernetes实战(二十九)-集群资源管理(CPU & Memory) 2025-04-03