死锁检测组件实现

简介: 死锁检测组件实现

       当线程多了之后,一部分线程做数据处理,一个线程做日志同步,还有做网络的线程及操作数据库的线程,当线程比较多的时候出现死锁的概率是很高的;

       使用htop去看cpu的使用情况,cpu占用率总是百分之百,这个时候就是进入了死锁的状态,一直在等一直在等;

       死锁的状态,是由于线程无法正常获取资源;如下1,2,3,4代表资源,A,B,C,D代表线程,开始1,2,3,4分别被A,B,C,D线程使用着,但是此时A又需要使用2,B需要使用4,C需要使用1,D需要使用3;而这些资源又已经被占用了无法竞争到,就产生了死锁;判断是否产生死锁就只要看是否有出现这样的环出现就可以了;

如何知道资源(比如pthread_mutex_lock(mutex))被哪个线程占用了呢?这个是不知道的,没办法判断的;

构建并打印死锁,通过hook机制,从而使得调用pthread_mutrex_lock,pthread_mutex_unlock时调用我们自己实现的对应函数;

#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
typedef int (*pthread_mutex_lock_t)(pthread_mutex_t *mutex);
typedef int (*pthread_mutex_unlock_t)(pthread_mutex_t *mutex);
pthread_mutex_lock_t pthread_mutex_lock_f;
pthread_mutex_unlock_t pthread_mutex_unlock_f;
int pthread_mutex_lock(pthread_mutex_t *mutex) {
    pthread_t selfid = pthread_self();
    pthread_mutex_lock_f(mutex);
    printf("pthread_mutex_lock: %ld, %p\n", selfid, mutex);
}
int pthread_mutex_unlock(pthread_mutex_t *mutex) {
    pthread_t selfid = pthread_self();
    pthread_mutex_unlock_f(mutex);
    printf("pthread_mutex_unlock: %ld, %p\n", selfid, mutex);
}
void init_hook(void) {
    pthread_mutex_lock_f = dlsym(RTLD_NEXT, "pthread_mutex_lock");
    pthread_mutex_unlock_f = dlsym(RTLD_NEXT, "pthread_mutex_unlock");
}
#if 1
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mutex2 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mutex3 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mutex4 = PTHREAD_MUTEX_INITIALIZER;
void *thread_funcA(void *arg) {
    pthread_mutex_lock(&mutex1);
    sleep(1);
    pthread_mutex_lock(&mutex2);
    printf("thread_funcA\n");
    pthread_mutex_unlock(&mutex2);
    pthread_mutex_unlock(&mutex1);
}
void *thread_funcB(void *arg) {
    pthread_mutex_lock(&mutex2);
    sleep(1);
    pthread_mutex_lock(&mutex3);
    printf("thread_funcB\n");
    pthread_mutex_unlock(&mutex3);
    pthread_mutex_unlock(&mutex2);
}
void *thread_funcC(void *arg) {
    pthread_mutex_lock(&mutex3);
    sleep(1);
    pthread_mutex_lock(&mutex4);
    printf("thread_funcC\n");
    pthread_mutex_unlock(&mutex4);
    pthread_mutex_unlock(&mutex3);
}
void *thread_funcD(void *arg) {
    pthread_mutex_lock(&mutex4);
    sleep(1);
    pthread_mutex_lock(&mutex1);
    printf("thread_funcD\n");
    pthread_mutex_unlock(&mutex1);
    pthread_mutex_unlock(&mutex4);
}
int main() {
    init_hook();
    pthread_t tida, tidb, tidc, tidd;
    pthread_create(&tida, NULL, thread_funcA, NULL);
    pthread_create(&tidb, NULL, thread_funcB, NULL);
    pthread_create(&tidc, NULL, thread_funcC, NULL);
    pthread_create(&tidd, NULL, thread_funcD, NULL);
    pthread_join(tida, NULL);
    pthread_join(tidb, NULL);
    pthread_join(tidc, NULL);
    pthread_join(tidd, NULL);
    return 0;
}
#endif

       死锁检测,可以通过构建有向图判断是否有环来检测;图的构建方式,可以通过矩阵和邻接表;以邻接表,若线程1申请线程2的资源,而该资源又被线程2占用着,我们就将线程1的next指针指向线程2,表示线程1生成的资源已经被线程2占用了;

       新增线程并在线程中有调用pthread_mutex_lock的时候就相当于在图上新增节点,新增边则是在当调用pthread_mutex_lock发现资源被其他线程占用的时候;

目录
相关文章
|
6月前
|
SQL 安全 PHP
SQL注入-下篇
本文介绍了HTTP注入中的Referer和Cookies注入原理与实操步骤,演示了通过SQL注入获取数据库信息及webShell的方法,并涵盖pikachu靶场搭建、DNSLog盲注等内容,帮助理解常见Web安全漏洞及其利用方式。
594 0
SQL注入-下篇
|
存储 芯片 移动开发
|
SQL 分布式计算 监控
Flume实时读取本地/目录文件到HDFS
Flume实时读取本地/目录文件到HDFS
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的二手车交易平台的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的二手车交易平台的详细设计和实现(源码+lw+部署文档+讲解等)
359 1
|
边缘计算 运维 容灾
重磅发布!阿里云发布《应用多活技术白皮书》,并开源首个多活项目AppActive
1月11日,在上海的云原生实战峰会上,阿里云智能研究员丁宇发布了“应用多活技术白皮书”,同时为了推动业界容灾的发展,建立云原生业务容灾标准,阿里云开源了“应用多活”项目AppActive。
62961 109
重磅发布!阿里云发布《应用多活技术白皮书》,并开源首个多活项目AppActive
|
Web App开发 开发框架 Dart
Flutter 3.0 正式发布:稳定支持 6 大平台,字节跳动是主要用户
5 月 12 日,Flutter 3.0 在 Google I/O 开发者大会正式亮相,随着 3.0 版本的发布,Flutter 开发框架终于可以支持六大平台,实现了其跨平台稳定运行的愿景。
1563 0
Flutter 3.0 正式发布:稳定支持 6 大平台,字节跳动是主要用户
可编程 USB 转串口适配器开发板 USB 转 UART和 I2C
USB2S 内置了 USB 转UART 芯片,可使用CH340/CH341 驱动程序。驱动安装步骤如下: 双击运行“CH341SER\SETUP.exe”,打开驱动安装窗口。
可编程 USB 转串口适配器开发板 USB 转 UART和 I2C
|
网络协议 物联网 数据安全/隐私保护
Wifi-nodeMCU-esp8266 建立热点同时作为服务器完成设备连接控制 | 学习笔记
快速学习 Wifi-nodeMCU-esp8266 建立热点同时作为服务器完成设备连接控制
Wifi-nodeMCU-esp8266 建立热点同时作为服务器完成设备连接控制 | 学习笔记
|
缓存 前端开发 安全
SpringBoot 开发抖音开放平台获取用户的粉丝统计和短视频数据(二篇)
最近有朋友问起我有没有做过抖音开放平台,让我有了些思考,其实之前做过的。虽然抖音APP很火,但是毕竟不像微信开放平台那样,已沉淀多年,基本上每个API只要肯用心查找,网上都有很多资料可以参考。而抖音开放平台则不然,刚面世不久,资料比较少。即使对于一个开发人员来说,接入第三方接口都大同小异,不会太难,但我还是想把这些记录下来,特别是遇到的坑,会列在下面,一起参考学习。限于水平有限,若有错误,不吝赐教哈。那么,我们就开始正文吧。
1389 0
SpringBoot 开发抖音开放平台获取用户的粉丝统计和短视频数据(二篇)

热门文章

最新文章