Windows多线程编程-临界区-产生死锁

Deadlock //死锁问题

问题引入:在目前的Windows系统中如果一个线程进入某个 critical section 而在未离开的情况下就结束(异常结束),而没有 执行LeaveCriticalSection() 的话,之后别的线程可以进入该临界区域吗?
程序实例:1)正常退出临界区域
Windows多线程编程-临界区-产生死锁_第1张图片
2)不退出临界区域
Windows多线程编程-临界区-产生死锁_第2张图片
结论:经对比发现,不退出临界区域的话,其他线程则无法进入该临界区域,这在一定程度上增强了系统的安全性。

那么现在就利用临界区产生死锁并对其进行分析。

程序思路:产生死锁则需要创建两个线程,需要初始化两块临界区,让线程落入你等我,我等你的状态。此时双方都需要对方退出自己最先进入的临界区域,接着互相等待对方最后退出的临界区域,这就像你把房门钥匙锁在了房间里。
代码实现:

#include
#include

CRITICAL_SECTION c_s1,c_s2;

DWORD WINAPI FUN1(LPVOID P)
{printf("线程1正在进入临界区1...\n");
	EnterCriticalSection(&c_s1);			//进入临界区域 
		Sleep(10);
		printf("线程1正在进入临界区2...\n");
		EnterCriticalSection(&c_s2);
	
		printf("线程1已进入临界区2!\n");
		printf("没有发生死锁!\n");
		
		LeaveCriticalSection(&c_s2);
		
	LeaveCriticalSection(&c_s1);			//退出临界区域 
	return 0;					//结束线程 
}

DWORD WINAPI FUN2(LPVOID P)
{printf("线程2正在进入临界区2...\n");
	EnterCriticalSection(&c_s2);			//进入临界区域 
		Sleep(10);
		printf("线程2正在进入临界区1...\n");
		EnterCriticalSection(&c_s1);
		printf("线程2已进入临界区1!\n");
		printf("没有发生死锁!\n");
		LeaveCriticalSection(&c_s1);
	LeaveCriticalSection(&c_s2);			//退出临界区域 
	return 0;				//结束线程 
}

int main()
{
	HANDLE H1,H2;
	
	InitializeCriticalSection(&c_s1);	// 初始化关键区域 既 c_s 
	InitializeCriticalSection(&c_s2);
	
	H1=CreateThread(NULL,0,FUN1,NULL,0,NULL);
	H1=CreateThread(NULL,0,FUN2,NULL,0,NULL);
	
	Sleep(100);					//等线程运行一会 
	DeleteCriticalSection(&c_s1);		// 用毕清除临界区域 c_s 
	DeleteCriticalSection(&c_s2);
	CloseHandle(H1);
	CloseHandle(H2);
	system("pause");
	return 0;
}

运行结果:
Windows多线程编程-临界区-产生死锁_第3张图片
结论:线程2正在进入临界区1,线程1进入临界区2都没有成功,这就发生死锁,在程序中线程2想入临界区1就得等线程1结束,线程1想结束就得等线程2结束,死锁随之发生。

你可能感兴趣的:(Windows多线程)