当前位置: 代码迷 >> 多核软件开发 >> 请问一多线程死锁的有关问题
  详细解决方案

请问一多线程死锁的有关问题

热度:10217   发布时间:2013-02-26 00:00:00.0
请教一多线程死锁的问题 - C/C++ / C++ 语言
请各位大侠详细解释下为什么会出现死锁,但是把线程函数改成下面的函数就不会出现死锁


#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");
就死锁了

两个线程都在等待一个永远等不到的资源
  相关解决方案