读书人

多线程中关键代码段死锁的疑问,该如何

发布时间: 2012-02-12 17:16:33 作者: rapoo

多线程中关键代码段死锁的疑问
看孙鑫的vc++深入详解时遇到关于关键代码段的问题。代码如下:
#include <windows.h>
#include <iostream.h>

DWORD WINAPI Fun1Proc(
LPVOID lpParameter // thread data
);

DWORD WINAPI Fun2Proc(
LPVOID lpParameter // thread data
);

int tickets=100;

CRITICAL_SECTION g_csA;
CRITICAL_SECTION g_csB;

void main()
{
HANDLE hThread1;
HANDLE hThread2;
hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);

InitializeCriticalSection(&g_csA);
InitializeCriticalSection(&g_csB);
Sleep(4000);

DeleteCriticalSection(&g_csA);
DeleteCriticalSection(&g_csB);
}

DWORD WINAPI Fun1Proc(
LPVOID lpParameter // thread data
)
{
while(TRUE)
{
//cout<<"thread1 running again!"<<endl;
EnterCriticalSection(&g_csA);
//cout<<"thread1 running!"<<endl;
Sleep(1);
EnterCriticalSection(&g_csB);
if(tickets>0)
{
Sleep(1);
cout<<"thread1 sell ticket : "<<tickets--<<endl;
}
else
break;
LeaveCriticalSection(&g_csB);
LeaveCriticalSection(&g_csA);
}

return 0;
}

DWORD WINAPI Fun2Proc(
LPVOID lpParameter // thread data
)
{

while(TRUE)
{
EnterCriticalSection(&g_csB);
Sleep(1);
EnterCriticalSection(&g_csA);
if(tickets>0)
{
Sleep(1);
cout<<"thread2 sell ticket : "<<tickets--<<endl;
}
else
break;
LeaveCriticalSection(&g_csA);
LeaveCriticalSection(&g_csB);
}
cout<<"thread2 is running!"<<endl;
return 0;
}
书上说这会发生死锁问题,这我能够理解,但问题是运行之后输出的全都是线程2的输出语句,我很纳闷,书上明明有图说因为死锁,什么也没能输出。但是我在线程1中添加了cout语句,就如上面代码注释的那两句,添加后运行就只是输出这两句,线程2的输出语句反而不输出了,这是为什么呢?

[解决办法]
把下面的放到Sleep(4000);后面
CloseHandle(hThread1);
CloseHandle(hThread2);
吧下面的放到CreateThread前面
InitializeCriticalSection(&g_csA);
InitializeCriticalSection(&g_csB);
[解决办法]
关键代码段是在线程中生效的,应该在线程创建之间初始化

另外线程刚创建就关闭,没有经验Sleep延时,通常是不会在里面做工作的

读书人网 >VC/MFC

热点推荐