实用工具调试寻找死锁现象实验

本文详细记录了使用C语言实现的死锁实验,通过pstack、GDB和Valgrind工具进行调试,展示了如何定位并解决线程间的死锁问题。实验中,线程thread3和thread2分别持有mutexA和mutexB导致死锁,而Valgrind则直观地揭示了锁的争抢情况。
摘要由CSDN通过智能技术生成

本篇博客主要记录一下课堂上的几个小实验

死锁调试实验

下面主要通过不同工具来写本篇博客
先贴上实验代码

#include <unistd.h> 
#include <pthread.h> 
#include <string.h> 
pthread_mutex_t mutexA = PTHREAD_MUTEX_INITIALIZER; 
pthread_mutex_t mutexB = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mutexC = PTHREAD_MUTEX_INITIALIZER; 

static int counterA = 0; 
static int counterB = 0; 
int func1() 
{ 
	pthread_mutex_lock(&mutexA); 
	++counterA; 
	sleep(1); 
	pthread_mutex_lock(&mutexB); 
	++counterB; 
	pthread_mutex_unlock(&mutexB); 
	pthread_mutex_unlock(&mutexA); 

	return counterA; 
} 

int func2() 
{ 
	pthread_mutex_lock(&mutexB); 
	++counterB; 
	sleep(1); 
	pthread_mutex_lock(&mutexA); 
	++counterA; 
	pthread_mutex_unlock(&mutexA); 
	pthread_mutex_unlock(&mutexB); 

	return counterB; 
} 
void* start_routine1(void* arg) 
{ 
	while (1) 
	{ 
		int iRetValue = func1(); 
	
		if (iRetValue == 100000) 
		{ 
			pthread_exit(NULL); 
		} 
	} 
} 

void* start_routine2(void* arg) 
{ 
	while (1) 
	{ 
		int iRetValue = func2(); 
		
		if (iRetValue == 100000) 
		{ 
			pthread_exit(NULL); 
		} 
	} 
} 

void* start_routine(void* arg) 
{ 
	while (1) 
	{ 
		sleep(1); 
		char szBuf[128]; 
		memset(szBuf, 0, sizeof(szBuf)); 
		strcpy(szBuf, (char*)arg); 
	} 
}

int main() 
{ 
	pthread_t tid[4]; 
	if (pthread_create(&tid[0], NULL, &start_routine1, NULL) != 0) 
	{ 
	_exit(1); 
	} 
	if (pthread_create(&tid[1], NULL, &start_routine2, NULL) != 0) 
	{ 
	_exit(1); 
	} 
	if (pthread_create(&tid[2], NULL, &start_routine, (char*)"thread3") != 0) 
	{ 
	_exit(1); 
	} 
	if (pthread_create(&tid[3], NULL, &start_routine, (char*)"thread3") != 0) 
	{ 
	_exit(1); 
	} 

	sleep(5); 
	//pthread_cancel(tid[0]); 
	
	pthread_join(tid[0], NULL); 
	pthread_join(tid[1], NULL); 
	pthread_join(tid[2], NULL); 
	pthread_join(tid[3], NULL); 
	
	pthread_mutex_destroy(&mutexA); 
	pthread_mutex_destroy(&mutexB); 
	pthread_mutex_destroy(&mutexC); 
	
	return 0; 
}

pstack

  • 使用pstack命令,可以查看正在运行的进程的调用栈

      需要注意的是,在我下载完成pstack的时候遇到了该脚本文件中出现乱码的问题
    

这篇博客可以解决

  • pstack 的结果
    从如下可以看到thread3 和thread2 拿到了两个mutexA 和mutexB 然后两个线程解锁时形成死锁
    在这里插入图片描述

GDB调试

下图是使用gdb来进行调式的,因为pstack是对gdb的封装,所以结果相同
在这里插入图片描述

varlgrind

在这里插入图片描述

在这里插入图片描述
可以很直观的看到thread3,thread2两线程发生了锁的争抢,能够很快定位问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值