模拟售票功能
1.以下程序是模拟售票功能,使用临界区对象,其中SellPro_1,SellPro_2两个函数分别对应两个售票进程,一次售出一张票。
(1)阅读程序,了解CRITICAL_SECTION的使用方法,
// An highlighted block
//模拟售票程序
#include <windows.h>
#include <iostream>
using namespace std;
DWORD WINAPI SellPro_1( LPVOID lpParameter);
DWORD WINAPI SellPro_2( LPVOID lpParameter );
int tickets=100;
CRITICAL_SECTION critical_sec; //定义关键区域
void main()
{
HANDLE hThread1;
HANDLE hThread2;
InitializeCriticalSection(&critical_sec); //初始化关键区域
hThread1=CreateThread(NULL,0,SellPro_1,NULL,0,NULL);
hThread2=CreateThread(NULL,0,SellPro_2,NULL,0,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
getchar();//Sleep(4000);
}
DWORD WINAPI SellPro_1( LPVOID lpParameter )
{
while(TRUE)
{
Sleep(1);
EnterCriticalSection(&critical_sec); //进入关键代码区域
if(tickets>0)
{
cout<<"thread1 sell ticket : "<<--tickets<<endl;
}
else
break;
LeaveCriticalSection(&critical_sec); //离开代码关键区域
}
return 0;
}
DWORD WINAPI SellPro_2( LPVOID lpParameter)
{
while(TRUE)
{
Sleep(1);
EnterCriticalSection(&critical_sec); //进入关键代码区域
if(tickets>0)
{
cout<<"thread2 sell ticket : "<<--tickets<<endl;
}
else
break;
LeaveCriticalSection(&critical_sec); //离开代码关键区域
}
return 0;
}
2.以下程序通过使用信号量对象模拟售票功能。
#include <iostream>
#include <windows.h>
using namespace std;
static HANDLE g_hSemaphore = INVALID_HANDLE_VALUE;
static int g_Count = 100;
DWORD WINAPI Thread_A(LPVOID lpParamter);
DWORD WINAPI Thread_B(LPVOID lpParamter);
int main(int argc, char** argv)
{
HANDLE threadA = INVALID_HANDLE_VALUE;
HANDLE threadB = INVALID_HANDLE_VALUE;
g_hSemaphore = CreateSemaphore(NULL, 1, 20, TEXT("semaphore"));
threadA = CreateThread(NULL, 0, Thread_A, NULL, 0, NULL);
threadB = CreateThread(NULL, 0, Thread_B, NULL, 0, NULL);
getchar(); //Sleep(5000);
CloseHandle(threadA);
CloseHandle(threadB);
return 0;
}
DWORD WINAPI Thread_A(LPVOID lpParamter)
{
long count;
while(1)
{
WaitForSingleObject(g_hSemaphore, INFINITE);
if(g_Count>0)
cout<<"thread_A:"<<g_Count--<<endl;
else
break;
ReleaseSemaphore(g_hSemaphore, 1,&count);
Sleep(10);
}
return 0;
}
DWORD WINAPI Thread_B(LPVOID lpParamter)
{
long count;
while(1)
{
WaitForSingleObject(g_hSemaphore, INFINITE);
if(g_Count>0)
cout<<"thread_B:"<<g_Count--<<endl;
else
break;
ReleaseSemaphore(g_hSemaphore, 1,&count);
Sleep(10);
}
return 0;
}
3.以下程序是模拟一个简单的生产者-消费者问题,只有一个缓冲区,存放一个整型数据。
#include <stdio.h>
#include <process.h>
#include <windows.h>
const int END_PRODUCE_NUMBER=20;
int g_Buffer;
CRITICAL_SECTION g_cs;
HANDLE g_hEventBufferEmpty,g_hEventBufferFull;
unsigned int __stdcall ProducerThreadFun(PVOID pM) //生产者进程
{
int i;
for (i=1;i<=END_PRODUCE_NUMBER;i++)
{
WaitForSingleObject(g_hEventBufferEmpty,INFINITE);
EnterCriticalSection(&g_cs);
g_Buffer=i;
printf("生产者将数据%d放入缓冲区\n",i);
LeaveCriticalSection(&g_cs);
SetEvent(g_hEventBufferFull);
Sleep(1000);
}
return 0;
}
unsigned int __stdcall ConsumerThreadFun(PVOID pM) //消费者进程
{
int flag=1;
while(flag)
{
WaitForSingleObject(g_hEventBufferFull,INFINITE);
EnterCriticalSection(&g_cs);
printf("消费者从缓冲区中取出数据%d\n",g_Buffer);
if(g_Buffer==END_PRODUCE_NUMBER)
flag=0;
LeaveCriticalSection(&g_cs);
SetEvent(g_hEventBufferEmpty);
Sleep(1000);
}
return 0;
}
int main()
{
HANDLE hThread[2];
printf("生产者消费者问题\n");
InitializeCriticalSection(&g_cs);
g_hEventBufferEmpty=CreateEvent(NULL,FALSE,TRUE,NULL);
g_hEventBufferFull=CreateEvent(NULL,FALSE,FALSE,NULL);
hThread[0]=(HANDLE)_beginthreadex(NULL,0,ProducerThreadFun,NULL,0,NULL);
hThread[1]=(HANDLE)_beginthreadex(NULL,0,ConsumerThreadFun,NULL,0,NULL);
WaitForMultipleObjects(2,hThread,TRUE,INFINITE);
CloseHandle(hThread[0]);
CloseHandle(hThread[1]);
CloseHandle(g_hEventBufferEmpty);
CloseHandle(g_hEventBufferFull);
DeleteCriticalSection(&g_cs);
return 0;
}