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

Linux死锁实验分析与总结

三、实验结果截图及分析

1. 实验代码
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mutex2 = PTHREAD_MUTEX_INITIALIZER;void* producer(void* arg) {while (1) {pthread_mutex_lock(&mutex1);sleep(1);pthread_mutex_lock(&mutex2);printf("Producer is producing...\n");pthread_mutex_unlock(&mutex2);pthread_mutex_unlock(&mutex1);}return NULL;
}void* consumer(void* arg) {while (1) {pthread_mutex_lock(&mutex2);sleep(1);pthread_mutex_lock(&mutex1);printf("Consumer is consuming...\n");pthread_mutex_unlock(&mutex1);pthread_mutex_unlock(&mutex2);}return NULL;
}int main() {pthread_t tid1, tid2;pthread_create(&tid1, NULL, producer, NULL);pthread_create(&tid2, NULL, consumer, NULL);pthread_join(tid1, NULL);pthread_join(tid2, NULL);return 0;
}
2. 运行结果

程序运行后挂起,无输出。通过 Ctrl+C 终止后重新运行多次,现象一致。

3. 死锁分析

使用 pstack 查看进程堆栈:

$ ps aux | grep deadlock
$ pstack <PID># 输出示例
Thread 2 (Thread 0x7f8a4b27e700 (LWP 12345)):
#0  0x00007f8a4c6d4e32 in __GI___pthread_mutex_lock (mutex=0x55d8c0e02010 <mutex2>) at ../nptl/pthread_mutex_lock.c:67
#1  0x000055d8c0e0193a in consumer (arg=0x0) at deadlock.c:18
...Thread 1 (Thread 0x7f8a4ba7f740 (LWP 12344)):
#0  0x00007f8a4c6d4e32 in __GI___pthread_mutex_lock (mutex=0x55d8c0e02000 <mutex1>) at ../nptl/pthread_mutex_lock.c:67
#1  0x000055d8c0e018e6 in producer (arg=0x0) at deadlock.c:9
...

分析:

  • 生产者线程(Thread 1)持有 mutex1,等待 mutex2

  • 消费者线程(Thread 2)持有 mutex2,等待 mutex1

  • 两个线程互相等待对方释放锁,形成循环等待,导致死锁。

4. 死锁原因
  • 锁顺序不一致:生产者先获取 mutex1 再 mutex2,消费者反之。

  • 资源竞争:双方同时持有一个锁并请求对方持有的锁,导致永久阻塞。


四、总结

1. 实验问题及解决
  • 问题1:死锁复现概率低。
    解决:在锁操作间添加 sleep(1) 增大竞争窗口。

  • 问题2:工具使用不熟练。
    解决:查阅 pstack 和 gdb 文档,熟悉多线程调试命令。

2. 心得体会
  • 设计阶段:明确锁的获取顺序是避免死锁的关键。

  • 调试技巧:堆栈跟踪工具能快速定位阻塞点,结合多次采样提高准确性。

  • 理论实践结合:通过实际代码验证了循环等待导致死锁的原理。

http://www.xdnf.cn/news/4328.html

相关文章:

  • 安卓基础(拖拽)
  • 前端知识-useState
  • 开启健康模式:养身新主张
  • Nginx 安全防护与Https 部署实战
  • 自定义SpringBoot Starter-笔记
  • Element-Plus-X开源程序是Vue3 + Element-Plus 开箱即用的企业级AI组件库前端的解决方案
  • 【言语理解】片段阅读之语句填入(7)
  • LeetCode 1781. 所有子字符串美丽值之和 题解
  • C++编程语言:从高效系统开发到现代编程范式的演进之路
  • python仓库库存管理系统-药房药品库存管理系统
  • 极简RT-Thread入门教程
  • 高等数学第六章---定积分(§6.1元素法6.2定积分在几何上的应用1)
  • XILINX原语之——xpm_fifo_async(异步FIFO灵活设置位宽、深度)
  • vscode远程服务器连接----过程尝试写入的管道不存在
  • javascript Map 和对象使用
  • echarts报错问题initialize failed:invalid dom
  • AI技术下研发体系重构
  • Vue项目Git提交流程集成
  • Leetcode 刷题记录 07 —— 链表
  • excel表数据导入数据库
  • Selenium模拟人类,操作网页的行为(全)
  • Pointpillars(三)工程实践
  • 新手SEO基础操作入门精要
  • Java学习手册:Base64 编码概念和应用场景
  • 解锁创意显示,强力巨彩软模组引领柔性显示技术创新
  • 随机快速排序算法
  • GAN模型
  • 总结七种提示优化方案的核心实现流程
  • 第15章 Python数据类型详解之分解理解:基础数据类型常见易错点和性能优化篇
  • Visual Studio 快捷键更改和设置