以售票系统为例子,创建两个售票进程对象,进行并发的售票操作。在进行售票的时候首先要通过Critical Section对象来创建一个资源锁对应用于实现不同线程对象之间对临界资源的互斥访问。
#include<stdio.h>
#include<Windows.h>
int g_dwTickets = 10;
CRITICAL_SECTION cs;//创建临界区资源用于实现对临界区资源代码段的互斥访问
//卖票进程对象
DWORD WINAPI MyFirstThread(LPVOID IpParameter) {
EnterCriticalSection(&cs);//对临界资源加锁,进入临界区
while (g_dwTickets>0)//判断是否有剩余车票
{
printf("还有:%d张车票 \n", g_dwTickets);
g_dwTickets--;
printf("买出一张,还有%d张 \n", g_dwTickets);
}
LeaveCriticalSection(&cs);//对临界区代码访问完毕,释放临界资源
return 0;
}
int main() {
DWORD dwResult1;
DWORD dwResult2;
HANDLE aThreadHandles[2];//当前句柄数组对象用于实现对线程句柄的接收操作
InitializeCriticalSection(&cs);//对临界区资源对象进行初始化操纵
//创建线程对象
aThreadHandles[0] = CreateThread(
NULL,//SD
0,//inital stack size
MyFirstThread,//thread function
NULL,//thread argument
0,//creation option
NULL//thread identifier
);
aThreadHandles[1] = CreateThread(NULL,0,MyFirstThread,NULL,0,NULL);
/*
WaitForMultipleObjects(
_In_ DWORD nCount, 所要等待的最大线程数
_In_reads_(nCount) CONST HANDLE* lpHandles, 要等待的全部线程对象线程对象句柄数组所在的地址
_In_ BOOL bWaitAll,等待模式 true表示只有要等待的所有线程对象的状态发生改变是才会停止等待,false表示有一个线程发生变化时就停止等待
_In_ DWORD dwMilliseconds 该函数的最大等待时间 infinte 表示一直等待下去
);
*/
//调用该函数对象来实现对所有售票线程进行等待,只有当全部售票线程对象执行完毕之后才会继续进行主线程的执行
WaitForMultipleObjects(2, aThreadHandles, TRUE, INFINITE);
//售票线程执行完毕之后获取两个线程对象的返回值并进行输出
GetExitCodeThread(aThreadHandles[0], &dwResult1);
GetExitCodeThread(aThreadHandles[1], &dwResult2);
printf("thread1 %d , Thread2 %d \n", dwResult1, dwResult2);
return 0;
}