首页 > 社交 > 科普中国

死锁检测实现

常驻编辑 科普中国 2022-09-25 死锁   钩子   遍历   节点   线程   解锁   函数   加锁   后台   资源

honk钩子主要实现pthread_mutex_lock、pthread_mutex_unlock的劫持,具体实现如下。YEQ拜客生活常识网

int pthread_mutex_lock(pthread_mutex_t *mutex){

    pthread_t selfid = pthread_self();
    lock_before(selfid, (uint64)mutex);
    pthread_mutex_lock_f(mutex);//执行系统加锁的入口函数
    lock_after(selfid, (uint64)mutex);
}


int pthread_mutex_unlock(pthread_mutex_t * mutex){

    pthread_t selfid = pthread_self();
    pthread_mutex_unlock_f(mutex);//执行系统解锁的入口函数
    unlock_after(selfid, (uint64)mutex);
}

static int init_hook(){

    pthread_mutex_lock_f = dlsym(RTLD_NEXT,"pthread_mutex_lock");
    pthread_mutex_unlock_f = dlsym(RTLD_NEXT,"pthread_mutex_unlock");
}

(6)Demo

//测试样例
pthread_mutex_t mtx1 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mtx2 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mtx3 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mtx4 = PTHREAD_MUTEX_INITIALIZER;

void *th_func1(void *arg) {
    
    pthread_mutex_lock(&mtx1);
    sleep(1);
    pthread_mutex_lock(&mtx2);
 
    pthread_mutex_unlock(&mtx2);
    pthread_mutex_unlock(&mtx1);
}

void *th_func2(void *arg) {

    pthread_mutex_lock(&mtx2);
    sleep(1);
    pthread_mutex_lock(&mtx3);

    pthread_mutex_unlock(&mtx3);
    pthread_mutex_unlock(&mtx2);
}

void *th_func3(void *arg) {

    pthread_mutex_lock(&mtx3);
    sleep(1);
    pthread_mutex_lock(&mtx1);

    pthread_mutex_unlock(&mtx1);
    pthread_mutex_unlock(&mtx3);

}

void *th_func4(void *arg) {

    pthread_mutex_lock(&mtx2);
    sleep(1);
    pthread_mutex_lock(&mtx3);

    pthread_mutex_unlock(&mtx3);
    pthread_mutex_unlock(&mtx2);
}


int main(){

    init_hook();//初始化hook
    start_check();//启动检测死锁线程
    pthread_t t1,t2,t3,t4;
    pthread_create(&t1,NULL,th_func1,NULL);
    pthread_create(&t2,NULL,th_func2,NULL);
    pthread_create(&t3,NULL,th_func3,NULL);
    pthread_create(&t4,NULL,th_func4,NULL);

    pthread_join(t1,NULL);
    pthread_join(t2,NULL);
    pthread_join(t3,NULL);
    pthread_join(t4,NULL);

    return 0;
}

原文地址:死锁检测实现 - MrJuJu - 博客园YEQ拜客生活常识网

相关阅读:

  • 越南要涨工资了,却暴露一个大问题
  • 从通用的协议栈层面来优化Redis性能的实践
  • Java中各种锁的介绍
  • 盐与献祭国王支线任务怎么做
  • 动手写一个模板方法模式(Java版)
  • 荷兰的首都在阿姆斯特丹,政府却在海牙
  • 云原生(十四)
  • 第五人格萌新玩家应该选什么监管?我来给大家说一下
  • 你遇到过最差劲的老师是谁?
  • 五个越玩越快乐的英雄,上分娱乐两不误,还能搞对手心态
    • 网站地图 |
    • 声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不做权威认证,如若验证其真实性,请咨询相关权威专业人士。