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

死锁例子学习

转自: 面试官:什么是死锁?如何解决死锁?写一段死锁的代码吧!_哈工大分出了多少学校-CSDN博客

1.介绍

。产生死锁的原因,主要包括:

  • 系统资源不足;如果系统资源充足,进程的资源请求都能够得到满足,那么死锁出现的可能性就很低;否则就会因争夺有限的资源而陷入死锁。
  • 程序执行的顺序有问题;
  • 资源分配不当等。

产生死锁的四个必要条件

  1. 互斥条件:一个资源每次只能被一个进程使用。
  2. 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
  3. 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
  4. 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
     

2.例子

#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>

std::mutex lock1;  // 对应 LOCK_1
std::mutex lock2;  // 对应 LOCK_2

void threadA() {
    try {
        while (true) {
            std::lock_guard<std::mutex> guard1(lock1);  // 锁住 lock1
            std::cout << std::this_thread::get_id() << " 锁住 lock1" << std::endl;
            std::this_thread::sleep_for(std::chrono::seconds(1));
            
            std::lock_guard<std::mutex> guard2(lock2);  // 锁住 lock2
            std::cout << std::this_thread::get_id() << " 锁住 lock2" << std::endl;
        }
    } catch (const std::exception& e) {
        std::cerr << "Exception in threadA: " << e.what() << std::endl;
    }
}

void threadB() {
    try {
        while (true) {
            std::lock_guard<std::mutex> guard2(lock2);  // 锁住 lock2
            std::cout << std::this_thread::get_id() << " 锁住 lock2" << std::endl;
            std::this_thread::sleep_for(std::chrono::seconds(1));
            
            std::lock_guard<std::mutex> guard1(lock1);  // 锁住 lock1
            std::cout << std::this_thread::get_id() << " 锁住 lock1" << std::endl;
        }
    } catch (const std::exception& e) {
        std::cerr << "Exception in threadB: " << e.what() << std::endl;
    }
}

int main() {
    std::thread t1(threadA);
    std::thread t2(threadB);

    t1.join();
    t2.join();

    return 0;
}

解决方案: 1)修改加锁顺序一致。2)等不到另一个锁时就释放已获取的锁。


http://www.kler.cn/news/305121.html

相关文章:

  • 汽车车门的美观与功能:矫平工艺的精细修复
  • VUE + NODE 历史版本安装
  • Python办公自动化案例(二):对比两个Excel数据内容并标出不同
  • 大模型探索式轨迹优化:基于试错的自主智能体学习新方法
  • iPhone 16和iPhone 16 Pro将发布时缺少这一关键功能
  • LabVIEW编程快速提升的技术
  • linux 图形如何设置x11 为主要图形
  • fuaeehfnklae
  • 一模--解题--71-80
  • Centos 7.9 使用 crontab 实现开机启动
  • 【C++】string类中常用函数的模拟实现
  • 【信奥赛模拟题中的选择题】
  • 合资油车断崖式崩盘,买车的千万慎重了
  • SAP自动化-AS02修改资产信息
  • NASA数据集:ASTER L2 地表辐射率 VNIR 和 SWIR V003
  • 上门按摩小程序APP系统源码开发搭建
  • yolov5明厨亮灶检测系统,厨师帽-口罩检测,带pyqt界面-可检测图片和视频,支持中文标签,检测接口已封装好并优化,代码可读性强!
  • ​招​银​网​络​​大​疆​​元​象​一​面​
  • 河海大学《2020年+2021年827自动控制原理真题》 (完整版)
  • Netty权威指南:Netty总结-Netty线程模型与架构剖析
  • 如何正确使用MMPI量表进行测试?
  • 关于 -fsanitize=address 的使用注意事项
  • 链路聚合(Link Aggregation)
  • 分享一个爬虫数据挖掘 农村产权交易数据可视化平台 数据分析大数据 Java、python双版(源码、调试、LW、开题、PPT)
  • Linux内核编译并移植至ARM平台
  • 【数据结构和算法实践-树-LeetCode113-路径总和Ⅱ】
  • 【数据结构】6——图1,概念
  • 【nginx】ngx_http_proxy_connect_module 正向代理
  • 『功能项目』C#拓展 - 优化冗余脚本【36】
  • unity3d入门教程五