代码
//Deadlock_Debug.cpp : 定义控制台应用程序的入口点。//#include"stdafx.h"#include"windows.h"#include
//All the thread must get all of critial_section//Classic Deadlock
CRITICAL_SECTION gCritSecFirst;
CRITICAL_SECTION gCritSecSecond;
CRITICAL_SECTION gCritSecThird;
unsigned __stdcall Thread1Func(void*dummy)
{
printf("Enter Thread 1 \n");
EnterCriticalSection(&gCritSecThird);
{
Sleep(5000);
EnterCriticalSection(&gCritSecFirst);
EnterCriticalSection(&gCritSecSecond);
LeaveCriticalSection(&gCritSecSecond);
LeaveCriticalSection(&gCritSecFirst);
}
LeaveCriticalSection(&gCritSecThird);
printf("Exit thread func 1 \n");return 1;
}
unsigned __stdcall Thread2Func(void*dummy)
{
printf("Enter Thread 2 \n");
EnterCriticalSection(&gCritSecFirst);
EnterCriticalSection(&gCritSecSecond);
{
Sleep(2000);
EnterCriticalSection(&gCritSecThird);
Sleep(5000);
LeaveCriticalSection(&gCritSecThird);
}
LeaveCriticalSection(&gCritSecSecond);
LeaveCriticalSection(&gCritSecFirst);
printf("Exit thread func 2 \n");return 1;
}int _tmain(int argc, _TCHAR*argv[])
{
unsigned threadID;
InitializeCriticalSection(&gCritSecFirst);
InitializeCriticalSection(&gCritSecSecond);
InitializeCriticalSection(&gCritSecThird);
_beginthreadex( NULL,0, &Thread1Func, NULL, 0, &threadID );
_beginthreadex( NULL,0, &Thread2Func, NULL, 0, &threadID );while(1);return 0;
}
这是一个经典死锁,开启两个线程,一个以123的次序拿锁,一个以321次序拿锁,互相等待着对方的锁而均不释放自己手中的锁。(此处锁也指CriticalSection)
比对线程等待的锁 及个锁的拥有者和锁定情况变可以判断
线程编号1e4 也就是线程2 等待004944c0
的锁(根据堆栈的RtlEnterCriticalSection函数部分查看)
0069fe94 0042d714 004944c0 57565554
5b5a5958 ntdll!RtlEnterCriticalSection+0x46 (FPO:
[1,0,0])
而004844c0的锁由线程编号1e0 就是线程1持有
而线程编号1e0 就是线程1 等待004944f0 的锁
该所有线程编号1e4持有
0059fe94 0042d5e0 004944f0 57565554 5b5a5958
ntdll!RtlEnterCriticalSection+0x46 (FPO: [1,0,0])
死锁!!!
找到原因就好修正了。
原文:http://www.cnblogs.com/itdef/p/3759963.html