#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)
{
EnterCriticalSection(&g_csA);
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;
}
/********************************
虽然弹出错误提示;
但是命令段显示的是
thread2 sell ticket :100
thread2 sell ticket :99
thread2 sell ticket :98
thread2 sell ticket :97
thread2 sell ticket :96
thread2 sell ticket :95
按道理应该是互锁的啊…………

解决方案 »

  1.   

    InitializeCriticalSection(&g_csA);
    InitializeCriticalSection(&g_csB);
    应该放在创建线程之前,不然Enter的时候还没有初始化肯定是会出错的
      

  2.   

    创建线程后,你又CloseHandle干啥?线程调用时机是不确定的,跟操作系统任务调度算法有关,不要想这种跟线程时机有关的问题。Sleep(1)是达不到睡1ms的精度,至少是10ms以上了。
      

  3.   

    #3说的是个问题,还有两个线程enter leave的顺序要一样#include <windows.h>
    #include <iostream.h>
    #include<conio.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 wmain()
    {
    HANDLE hThreads[2];
    InitializeCriticalSection(&g_csA);
    InitializeCriticalSection(&g_csB);
    hThreads[0]=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
    hThreads[1]=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
    //CloseHandle(hThread1);
    //CloseHandle(hThread2);
    WaitForMultipleObjects(2,hThreads,1,INFINITE);
    //Sleep(4000);DeleteCriticalSection(&g_csA);
    DeleteCriticalSection(&g_csB);
    }DWORD WINAPI Fun1Proc(
      LPVOID lpParameter // thread data
    )
    {
    while(TRUE)
    {
    EnterCriticalSection(&g_csA);
    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_csA);
    Sleep(1);
    EnterCriticalSection(&g_csB);
    if(tickets>0)
    {
    Sleep(1);
    cout<<"thread2 sell ticket : "<<tickets--<<endl;
    }
    else
    break;
    LeaveCriticalSection(&g_csB);
    LeaveCriticalSection(&g_csA);
    }
    cout<<"thread2 is running!"<<endl;
    return 0;
    }