#include <Windows.h>
#include <iostream>
using namespace std;DWORD WINAPI FunThread1(LPVOID lpParam);
DWORD WINAPI FunThread2(LPVOID lpParam);int g_iTicket = 100;
CRITICAL_SECTION g_cs;void main()
{
    //线程1
    HANDLE hThread1 = NULL;
    hThread1 = CreateThread(NULL,0,FunThread1,NULL,0,NULL);
    if(NULL != hThread1)
    {
        CloseHandle(hThread1);
    }    //线程2
    HANDLE hThread2 = NULL;
    hThread2 = CreateThread(NULL,0,FunThread2,NULL,0,NULL);
    if(NULL != hThread2)
    {
        CloseHandle(hThread2);
    }    cout<<"main is end"<<endl;    InitializeCriticalSection(&g_cs);
    Sleep(10000);
    DeleteCriticalSection(&g_cs);}//线程1
DWORD WINAPI FunThread1(LPVOID lpParam)
{
    while (TRUE)
    {
        EnterCriticalSection(&g_cs);
        Sleep(1);
        if( g_iTicket > 0 )
        {
            Sleep(1);
            cout<<"线程1  "<<"iTicket =  "<<g_iTicket<<endl;
            g_iTicket--;
            LeaveCriticalSection(&g_cs);
        }
        else
        {
            LeaveCriticalSection(&g_cs);
            break;
        }
    }
    return 0;
}//线程2
DWORD WINAPI FunThread2(LPVOID lpParam)
{
    while (TRUE)
    {
        EnterCriticalSection(&g_cs);
        Sleep(1);
        if( g_iTicket > 0 )
        {
            Sleep(1);
            cout<<"线程2  "<<"iTicket =  "<<g_iTicket<<endl;
            g_iTicket--;
            LeaveCriticalSection(&g_cs);
        }
        else
        {
            LeaveCriticalSection(&g_cs);
            break;
        }
    }
    return 0;
}
不知道为什么就是要报错WIN32控制台程序的
谢谢帮忙!

解决方案 »

  1.   

    InitializeCriticalSection 太晚了,放在线程创建之前。
    DeleteCriticalSection(&g_cs);能保证线程都返回了吗?不然也会出错的。
      

  2.   

    Sleep处可以改用WaitForMultipleObjects来判断两个线程是否都退出,
      

  3.   


    #include <Windows.h>
    #include <iostream>
    using namespace std;DWORD WINAPI FunThread1(LPVOID lpParam);
    DWORD WINAPI FunThread2(LPVOID lpParam);int g_iTicket = 100;
    CRITICAL_SECTION g_cs;void main()
    {
    InitializeCriticalSection(&g_cs); HANDLE hThread[2] = {0};
        //Ïß³Ì1
        hThread[0] = CreateThread(NULL,0,FunThread1,NULL,0,NULL);
        if(NULL == hThread[0])
        {
    printf("Error 1");
    DeleteCriticalSection(&g_cs);
    return ;
        }

        //Ïß³Ì2
        hThread[1] = CreateThread(NULL,0,FunThread2,NULL,0,NULL);
        if(NULL == hThread[1])
        {
            printf("Error 2");
    if(hThread[0])
    {
    WaitForSingleObject(hThread[0], INFINITE);
    CloseHandle(hThread[0]);
    }
    DeleteCriticalSection(&g_cs);
        }

        cout<<"main is end"<<endl;

    WaitForMultipleObjects(2, hThread, TRUE, INFINITE);
    CloseHandle(hThread[0]);
    CloseHandle(hThread[1]);    DeleteCriticalSection(&g_cs);
    }//Ïß³Ì1
    DWORD WINAPI FunThread1(LPVOID lpParam)
    {
        while (TRUE)
        {
            EnterCriticalSection(&g_cs);
            Sleep(1);
            if( g_iTicket > 0 )
            {
                Sleep(1);
                cout<<"Ïß³Ì1  "<<"iTicket =  "<<g_iTicket<<endl;
                g_iTicket--;
                LeaveCriticalSection(&g_cs);
            }
            else
            {
                LeaveCriticalSection(&g_cs);
                break;
            }
        }
        return 0;
    }//Ïß³Ì2
    DWORD WINAPI FunThread2(LPVOID lpParam)
    {
        while (TRUE)
        {
            EnterCriticalSection(&g_cs);
            Sleep(1);
            if( g_iTicket > 0 )
            {
                Sleep(1);
                cout<<"Ïß³Ì2  "<<"iTicket =  "<<g_iTicket<<endl;
                g_iTicket--;
                LeaveCriticalSection(&g_cs);
            }
            else
            {
                LeaveCriticalSection(&g_cs);
                break;
            }
        }
        return 0;
    }
      

  4.   

    报错的主要原因是InitializeCriticalSection(&g_cs);太晚了,线程已经调用了EnterCriticalSection(&g_cs);时初始化还没有完成。
      

  5.   

    为什么呢?明明还没有Sleep我就调用了InitializeCriticalSection的哇。
      

  6.   


    CreateThread成功之后线程就开启了!不是等到你去sleep才开始