多线程同步有关问题,崩了

多线程同步问题,崩了
#include <stdio.h>
#include <windows.h>

DWORD WINAPI myfun1(LPVOID lpParameter);                   //声明线程函数
DWORD WINAPI myfun2(LPVOID lpParameter);
static int a1 = 0;
CRITICAL_SECTION Section;

int main()
{
HANDLE h1, h2;
h1 = ::CreateThread(NULL, 0, myfun1, NULL, 0, NULL);   //创建线程
printf("线程1开始运行!\r\n");
h2 = ::CreateThread(NULL, 0, myfun2, NULL, 0, NULL);
printf("线程2开始运行!\r\n");
::CloseHandle(h1);                                     //关闭线程句柄对象
::CloseHandle(h2);
InitializeCriticalSection(&Section);                   //初始化临界区对象
::Sleep(5000);
printf("按q正常退出!\r\n");
if(getchar() == 'q')
{
DeleteCriticalSection(&Section);
}
else
{
return 0;
}
return 0;
}
DWORD WINAPI myfun1(LPVOID lpParameter)
{
while(1)
{
EnterCriticalSection(&Section);
a1++;
if(a1 < 1000)
{
::Sleep(1000);
printf("线程1正在计数%d\r\n", a1);
LeaveCriticalSection(&Section);
}
else
{
LeaveCriticalSection(&Section);
break;
}
}
return 0;
}
DWORD WINAPI myfun2(LPVOID lpParameter)
{
while(1)
{
EnterCriticalSection(&Section);
a1++;
if(a1 < 1000)
{
::Sleep(1000);
printf("线程2正在计数%d\r\n", a1);
LeaveCriticalSection(&Section);
}
else
{
LeaveCriticalSection(&Section);
break;
}
}
return 0;
}

为什么运行之后停止工作!!~~~
------解决思路----------------------

InitializeCriticalSection(&Section);                   //初始化临界区对象
h1 = ::CreateThread(NULL, 0, myfun1, NULL, 0, NULL);   //创建线程
...
InitializeCriticalSection(&Section); 必须放在EnterCriticalSection(&Section);前面执行
你还没初始化就想用所以会报错