首页 > 数据库技术 > 详细

linux gdb调试C/C++多线程死锁的定位

时间:2021-05-15 00:29:54      阅读:38      评论:0      收藏:0      [点我收藏+]
#include <thread>
  2 #include <iostream>
  3 #include <mutex>
  4 using namespace std;
  5 mutex _mutex1;
  6 mutex _mutex2;
  7 int date1;
  8 int date2;
  9 int do_work_1()
 10 {
 11     cout <<  "thread_1 start" << endl;
 12     lock_guard<mutex> locker1(_mutex1);
 13     date1++;
 14     this_thread::sleep_for(chrono::seconds(1));
 15     lock_guard<mutex> locker2(_mutex2);
 16     date2++;
 17     cout << "thread_1 end" << endl;
 18     return 0;
 19 }
 20 int do_work_2()
 21 {
 22     cout << "thread_2 start" << endl;
 23     lock_guard<mutex> locker2(_mutex2);
    date2++;
 25     this_thread::sleep_for(chrono::seconds(1));
 26     lock_guard<mutex> locker1(_mutex1);
 27     date1++;
 28     cout << "thread_2 end" << endl;
 29     return 0;
 30 }
 31 int main()
 32 {
 33     thread t1(do_work_1);
 34     thread t2(do_work_2);
 35     t1.join();
 36     t2.join();
 37     cout << "end" << endl;
 38     return 0;
 39 
 40 }

  

  写了一个多线程死锁的程序,在linux下

(1)g++ -Wall -g -o test mutex.cpp -lpthread

  (2)  gdb test

  (3) 执行r

技术分享图片

 

 产生死锁

 (4) 按下ctrl + C 使程序中断

     查看当前主线程的栈帧(bt)

技术分享图片

 

   查看栈帧2停的位置

技术分享图片

 

   初步判断是产生了死锁,因为join没有执行。

技术分享图片

 

   查看一下当前的线程,转换一下线程,查看对应的栈帧。

技术分享图片

 

 

 

 技术分享图片

 

 查看到线程2 卡在locker2上,就可以判断产生了死锁

linux gdb调试C/C++多线程死锁的定位

原文:https://www.cnblogs.com/hxl-learning-space/p/14769991.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!