windows临界资源学习 6

        以售票系统为例子,创建两个售票进程对象,进行并发的售票操作。在进行售票的时候首先要通过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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值