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

gdb调试死锁

Linux下gdb调试死锁

死锁条件

  1. 互斥条件(Mutual Exclusion)
    定义:资源具有排他性,即一个资源在同一时间只能被一个线程(或进程)占用,其他线程必须等待该资源被释放后才能使用。

    解释:这是死锁产生的基础。如果资源可以被多个线程同时访问(如读写锁的 “读模式”),则不会因争夺该资源而产生死锁。

    示例:打印机、独占锁(如std::mutex)都是互斥资源。当线程 A 持有mutex1时,线程 B 必须等待 A 释放mutex1才能获取。

  2. 持有并等待条件(Hold and Wait)
    定义:一个线程已经持有至少一个资源,同时又在等待获取其他线程所持有的资源,且在等待过程中不释放自己已持有的资源。

    解释:线程在获取资源时并非一次性获取所有需要的资源,而是先持有部分资源,再等待其他资源,这就可能导致多个线程互相等待对方的资源。

    示例:线程 A 持有mutex1,同时等待mutex2;线程 B 持有mutex2,同时等待mutex1。此时两者都 “持有部分资源并等待其他资源”,满足该条件。

  3. 不可剥夺条件(No Preemption)
    定义:线程已持有的资源不能被其他线程强制剥夺,只能由该线程主动释放

    解释:如果资源可以被强制剥夺(例如操作系统的进程调度中,高优先级进程可抢占低优先级进程的 CPU 资源),则死锁不会发生。但多数资源(如锁、文件句柄)不支持强制剥夺,因此该条件容易满足。

    示例:线程 A 持有mutex1,线程 B 等待mutex1时,无法强制让 A 释放mutex1,只能等待 A 主动调用unlock()。

  4. 循环等待条件(Circular Wait)
    定义:多个线程之间形成一种首尾相接的等待关系,即线程 1 等待线程 2 持有的资源,线程 2 等待线程 3 持有的资源,……,线程 n 等待线程 1 持有的资源,形成一个闭环。

    解释:这是死锁的直观表现。循环等待依赖于前三个条件的存在,只有当多个线程互相等待对方的资源时,才会形成闭环。

    示例:线程 A 等待线程 B 的mutex2,线程 B 等待线程 A 的mutex1,形成 “A→B→A” 的循环等待;若有三个线程,则可能形成 “A→B→C→A” 的闭环。

代码

#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>using namespace std;// 定义两个互斥锁
mutex mtx1, mtx2;// 线程1:先获取mtx1,再获取mtx2
void thread_func1() {cout << "线程1:尝试获取mtx1" << endl;lock_guard<mutex> lock1(mtx1);  // 获取mtx1cout << "线程1:已获取mtx1" << endl;// 模拟处理时间,让线程2有机会获取mtx2this_thread::sleep_for(chrono::seconds(1));cout << "线程1:尝试获取mtx2" << endl;lock_guard<mutex> lock2(mtx2);  // 尝试获取mtx2,此时会阻塞cout << "线程1:已获取mtx2(不会执行到这里)" << endl;
}// 线程2:先获取mtx2,再获取mtx1
void thread_func2() {cout << "线程2:尝试获取mtx2" << endl;lock_guard<mutex> lock2(mtx2);  // 获取mtx2cout << "线程2:已获取mtx2" << endl;// 模拟处理时间,让线程1有机会获取mtx1this_thread::sleep_for(chrono::seconds(1));cout << "线程2:尝试获取mtx1" << endl;lock_guard<mutex> lock1(mtx1);  // 尝试获取mtx1,此时会阻塞cout << "线程2:已获取mtx1(不会执行到这里)" << endl;
}int main() {thread t1(thread_func1);thread t2(thread_func2);t1.join();t2.join();cout << "程序结束(不会执行到这里)" << endl;return 0;
}

gbd调试过程

在这里插入图片描述

  1. 运行程序,程序因死锁无法继续执行
    在这里插入图片描述

  2. Ctrl+C停止,info threads查看所有线程信息
    在这里插入图片描述

  3. 查看thread 2,bt查看堆栈,程序在main.cpp 124行卡住
    在这里插入图片描述

http://www.dtcms.com/a/365578.html

相关文章:

  • 安卓APP上架之安卓App备案的三要素:包名、公钥与MD5签名的深度解析-优雅草卓伊凡
  • Java设计模式之创建型—建造者模式
  • 零基础学英语APP推荐:一个程序员的亲测有效逆袭攻略
  • 普通人也能走的自由之路
  • 限流、降级、熔断的区别和应用场景
  • 9月3日星期三今日早报简报微语报早读
  • 多路复用 I/O 函数——`select`函数
  • SystemServer 启动流程
  • EDVAC:现代计算机体系的奠基之作
  • 影像服务免费方案:GIS Server让GeoTIFF数据在山海鲸中直观呈现
  • PyTorch实战——ResNet与DenseNet详解
  • 关于嵌入式学习——嵌入式硬件2
  • Mac电脑Tomcat+Java项目中 代码更新但8080端口内容没有更新
  • 打破信息洪流:微算法科技(NASDAQ:MLGO)推出一种移动互联网环境下数字媒体热点挖掘算法
  • 01-Redis 发展简史与核心定位解析:从诞生到三大产品矩阵
  • 微信小程序预览和分享文件
  • 从检索的角度聊聊数据结构的演进​
  • Vue 评论组件设计 V1.0
  • 关于linux软件编程15——数据库编程sqlite3
  • Spring Boot配置error日志发送至企业微信
  • EI会议:第七届人工智能与先进制造国际会议(AIAM 2025)
  • 多智能体协作系统(CrewAI)
  • 素材合集!直播间带货音乐BGM合集,抖音直播间常用热门音乐合集,根据中文分类,方便查找
  • AI重塑SaaS:从被动工具到智能角色的技术演进路径
  • Shell 三剑客之 awk 命令详解(理论+实战)
  • Datawhale AI夏令营复盘[特殊字符]:我如何用一个Prompt,在Coze Space上“画”出一个商业级网页?
  • SDK介绍
  • MCP模型库哪个好?2025年收录12万+服务的AI智能体工具集成平台推荐
  • 面试复习题-kotlin
  • Springboot 练手项目(删除部门-接口开发)