mutex AA死锁分析过程

记录c++ std::mutex AA死锁分析过程

源码

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

int g_i = 0;
std::mutex g_i_mutex;

void safe_increment()
{
    g_i_mutex.lock();
    g_i_mutex.lock();
    ++g_i;
}

int main()
{
    std::thread t1(safe_increment);
    std::thread t2(safe_increment);

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

    getchar();
    return 0;
}

调试分析

  1. 编译连接,生成可执行程序main
    user@dcs-04c2d773-0:/workspace/CPPProject$ g++ -g main.cpp -o main -lpthread

  2. 运行可执行程序main,发现程序卡住
    user@dcs-04c2d773-0:/workspace/CPPProject$ ./main

  3. 查看程序的进程id,找到id为563
    user@dcs-04c2d773-0:/workspace/CPPProject$ ps -aux | grep “main”
    user 1 0.0 0.3 5728 3348 ? Ss 14:20 0:00 /bin/bash -c ?#!/bin/bash ?/.dcs/main & ?if [ “C++” == “HTML” ]; then ??PROJECT_ROOT=/workspace /usr/local/bin/tc-simple-web & ?fi ?sleep infinity ?
    user 6 0.0 1.4 574992 15080 ? Sl 14:20 0:00 /.dcs/main
    user 563 0.0 0.1 22096 1560 pts/2 Sl+ 14:40 0:00 ./main
    user 656 0.0 0.0 5072 664 pts/3 S+ 14:43 0:00 grep main

  4. gdb挂住的进程
    user@dcs-04c2d773-0:/workspace/CPPProject$ gdb -p 563
    在这里插入图片描述
    在这里插入图片描述
    发现程序卡在join,对应代码中的第20行,即说明t1线程卡住。

  5. 查看线程信息
    在这里插入图片描述
    主线程为563,有2个子线程,id为565和566。两个子线程也在wait lock。

  6. 打印锁信息
    在这里插入图片描述发现mutex锁被565持有。

  7. 切换线程,查看堆栈信息
    在这里插入图片描述
    在这里插入图片描述

切换到线程565,相对id为2,查看堆栈,发现挂在第11行,即第二次加锁挂住。至此,就可以确认是AA锁导致挂死。

同时也可以推断出:线程566,肯定也加不到锁,挂在第10行。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值