孙鑫教程里的一个有关问题

孙鑫教程里的一个问题
在第十六章《线程同步与异步套接字编程》的16.2.2小节:利用关键代码段实现线程同步
我照抄着孙鑫的代码,为什么执行起来有错?对照了好几遍,没有发现哪儿出错。代码如下:

#include <windows.h>
#include <iostream.h>

DWORD WINAPI Fun1Proc(LPVOID lpParameter);
DWORD WINAPI Fun2Proc(LPVOID lpParameter);

int tickets = 100;
CRITICAL_SECTION g_cs;

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_cs);
//让主线程睡眠4秒
Sleep(4000);

DeleteCriticalSection(&g_cs);
}

DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
while(TRUE)
{
EnterCriticalSection(&g_cs);
Sleep(1);
if (tickets > 0)
{
Sleep(1);
cout << "thread1 sell ticket:" << tickets-- << endl;
LeaveCriticalSection(&g_cs);
}
else
{
LeaveCriticalSection(&g_cs);
break;
}
}
return 0;
}

DWORD WINAPI Fun2Proc(LPVOID lpParameter)
{
while(TRUE)
{
EnterCriticalSection(&g_cs);
Sleep(1);
if (tickets > 0)
{
Sleep(1);
cout << "thread2 sell ticket:" << tickets-- << endl;
LeaveCriticalSection(&g_cs);
}
else
{
LeaveCriticalSection(&g_cs);
break;
}
}
return 0;
}


执行结果:
孙鑫教程里的一个有关问题

谁知道这是什么问题?
多线程 孙鑫 MFC

------解决方案--------------------
InitializeCriticalSection(&g_cs);
这个放到CreateThread的前面做。
------解决方案--------------------
除了1楼说的原因外, 还有你那个DeleteCriticalSection(&g_cs);放的地方也不对, 因为线程还没有结束, 也就是说这个临界区还在使用, 就被你删除掉了, 那程序就可能崩溃了. 你可以尝试把那个Sleep改得长一点.