菜鸟学习C++-使用GDB调试多线程死锁

本文介绍了如何在Linux环境下使用GDB调试C++多线程程序中的死锁问题。通过创建一个模拟死锁的狗啃骨头的例子,详细展示了从编译参数设置到线程创建错误排查,再到利用GDB的`info threads`、`thread`和`backtrace`命令分析线程状态和堆栈信息的全过程。
摘要由CSDN通过智能技术生成

多线程是C++中经常使用的技术。多线程经常访问共享资源,这时候就可能需要线程同步技术。如果对共享资源有访问顺序,操作不当的话就很容易产生死锁。在本节,笔者就和大家一起看看在linux机器上怎么调试多线程死锁。

      首先,构造一份多线程死锁的程序。我把命名为“狗”示例类。狗狗爱啃骨头,那么它就有两个线程:线程1是从头开始吃骨头,线程2是从尾开始吃。

对资源的保护使用了互斥体。这两个线程其实很简单,线程1先获取互斥体1,然后睡眠5秒,再来获取互斥体2;线程2则相反。这样就出现了线程之间互相等待的现象。

DogSample.代码如下:

#ifndef _DOGSAMPLE_H

#define _DOGSAMPLE_H

 

#include<pthread.h>

#include <string>

using namespace std;

 

class DogSample

{

private:

  pthread_mutex_t p_lokFirst;

  pthread_mutex_t p_lokEnd;

    string strTalk;

 

public:

  static void *eatFromFirst(void *);

  static void *eatFromEnd(void *);

 

  DogSample();

  ~DogSample();

 

  int initial();

  int unInitial();

 

  int startEat();

 

 

};

 

#endif

DogSample.cpp如下:

#include"DogSample.h"

#include<unistd.h>

#include<stdio.h>

 

DogSample::DogSample()

{

  this->s

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值