#include <iostream>
using namespace std;
DWORD WINAPI FunProc01(LPVOID lpParameter);
DWORD WINAPI FunProc02(LPVOID lpParameter);
int g_nTickets = 100 ;
CRITICAL_SECTION g_cs;
int main()
{
HANDLE hThread01;
HANDLE hThread02;
hThread01 = CreateThread(NULL, 0, FunProc01, NULL, 0 , NULL);
hThread02 = CreateThread(NULL, 0, FunProc02, NULL, 0 , NULL);
CloseHandle(hThread01);
CloseHandle(hThread02);
InitializeCriticalSection(& g_cs);
while (true )
{
if (g_nTickets > 0 )
{
Sleep(100 );
}
else
{
break ;
}
}
DeleteCriticalSection(& g_cs);
return 0 ;
}
DWORD WINAPI FunProc01(LPVOID lpParameter)
{
while (true )
{
EnterCriticalSection(& g_cs);
Sleep(1 );
if (g_nTickets > 0 )
{
Sleep(1 );
cout << "Thread01 sales ticket " << g_nTickets << endl;
g_nTickets-- ;
}
LeaveCriticalSection(& g_cs);
}
return 0 ;
}
DWORD WINAPI FunProc02(LPVOID lpParameter)
{
while (true )
{
EnterCriticalSection(& g_cs);
Sleep(1 );
if (g_nTickets > 0 )
{
Sleep(1 );
cout << "Thread02 sales ticket " << g_nTickets << endl;
g_nTickets-- ;
}
LeaveCriticalSection(& g_cs);
}
return 0 ;
}
VS.net 2003 下结果:
Thread01 sales ticket 36
Thread02 sales ticket 35
Thread01 sales ticket 34
Thread02 sales ticket 33
Thread01 sales ticket 32
Thread02 sales ticket 31
Thread01 sales ticket 30
Thread02 sales ticket 29
Thread01 sales ticket 28
Thread02 sales ticket 27
Thread01 sales ticket 26
Thread02 sales ticket 25
Thread01 sales ticket 24
Thread02 sales ticket 23
Thread01 sales ticket 22
Thread02 sales ticket 21
Thread01 sales ticket 20
Thread02 sales ticket 19
Thread01 sales ticket 18
Thread02 sales ticket 17
Thread01 sales ticket 16
Thread02 sales ticket 15
Thread01 sales ticket 14
Thread02 sales ticket 13
Thread01 sales ticket 12
Thread02 sales ticket 11
Thread01 sales ticket 10
Thread02 sales ticket 9
Thread01 sales ticket 8
Thread02 sales ticket 7
Thread01 sales ticket 6
Thread02 sales ticket 5
Thread01 sales ticket 4
Thread02 sales ticket 3
Thread01 sales ticket 2
Thread02 sales ticket 1
Press any key to continue