请各位大侠详细解释下为什么会出现死锁,但是把线程函数改成下面的函数就不会出现死锁
#include <windows.h>
#include <stdio.h>
CRITICAL_SECTION cs1, cs2;
long WINAPI ThreadFn(long);
main()
{
DWORD iThreadID;
InitializeCriticalSection(&cs1);
InitializeCriticalSection(&cs2);
CloseHandle(CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadFn, NULL,
0,&iThreadID));
while (TRUE)
{
EnterCriticalSection(&cs1);
printf("\n 线程1 占用临界区1");
EnterCriticalSection(&cs2);
printf("\n 线程1 占用临界区2");
printf("\n 线程1 占用两个临界区");
LeaveCriticalSection(&cs2);
LeaveCriticalSection(&cs1);
printf("\n 线程1 释放两个临界区");
Sleep(20);
};
return (0);
}
long WINAPI ThreadFn(long lParam)
{
while (TRUE)
{
EnterCriticalSection(&cs2);
printf("\n 线程2 占用临界区2");
EnterCriticalSection(&cs1);
printf("\n 线程2 占用临界区1");
printf("\n 线程2 占用两个临界区");
LeaveCriticalSection(&cs1);
LeaveCriticalSection(&cs2);
printf("\n 线程2 释放两个临界区");
Sleep(20);
};
}
修改后的线程函数:
long WINAPI ThreadFn(long lParam)
{
while (TRUE)
{
EnterCriticalSection(&cs1);
printf("\n 线程2 占用临界区2");
EnterCriticalSection(&cs2);
printf("\n 线程2 占用临界区1");
printf("\n 线程2 占用两个临界区");
LeaveCriticalSection(&cs1);
LeaveCriticalSection(&cs2);
printf("\n 线程2 释放两个临界区");
Sleep(20);
};
}
------解决方案--------------------------------------------------------
当你主线程执行到 printf("\n 线程1 占用临界区1")
恰好分线程执行到 printf("\n 线程2 占用临界区2");
就死锁了
两个线程都在等待一个永远等不到的资源