多线程是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