windows多线程系列004 利用关键代码段实现线程同步

首先,看概念:关键代码段,也称为临界区,工作在用户方式下。它是指一小段代码段,在代码能够执行前,它必须独占对某些资源的访问权。
了解完概念,同样看4个函数原型:
(1)InitializeCriticalSection()初始化关键代码段
VOID
WINAPI
InitializeCriticalSection(
_Out_ LPCRITICAL_SECTION lpCriticalSection
);
lpCriticalSection
LPCRITICAL_SECTION结构体类型的对象,临界资源对象指针
(2)DeleteCriticalSection()释放一个没有被任何线程所拥有的临界区对象的所有资源
VOID
WINAPI
DeleteCriticalSection(
_Inout_ LPCRITICAL_SECTION lpCriticalSection
);
lpCriticalSection
LPCRITICAL_SECTION结构体类型的对象,临界资源对象指针
(3)EnterCriticalSection()进入关键代码段
VOID
WINAPI
EnterCriticalSection(
_Inout_ LPCRITICAL_SECTION lpCriticalSection
);
lpCriticalSection
LPCRITICAL_SECTION结构体类型的对象,临界资源对象指针
(4)LeaveCriticalSection()释放指定的临界区对象的所有权
VOID
WINAPI
LeaveCriticalSection(
_Inout_ LPCRITICAL_SECTION lpCriticalSection
);
lpCriticalSection
LPCRITICAL_SECTION结构体类型的对象,临界资源对象指针
上代码:
#include <windows.h>
#include <iostream>
using namespace std;

DWORD WINAPI Fun41Proc(LPVOID lpParameter);
DWORD WINAPI Fun42Proc(LPVOID lpParameter);

//int index=0;
int tickets4 = 100;

CRITICAL_SECTION g_cs;

void main(){

	HANDLE hThread1;
	HANDLE hThread2;

	//创建线程
	hThread1 = CreateThread(NULL, 0, Fun41Proc, NULL, 0, NULL);
	hThread2 = CreateThread(NULL, 0, Fun42Proc, NULL, 0, NULL);

	//关闭句柄,函数并没有终止新创建的线程,只是表示在主线程中对新创建的线程的引用不感兴趣,因此将它关闭
	CloseHandle(hThread1);
	CloseHandle(hThread2);

	InitializeCriticalSection(&g_cs);
	//main 函数主线程等待4秒
	Sleep(1000);

	DeleteCriticalSection(&g_cs);

	system("pause");
	return;
}

//线程1的入口函数
DWORD WINAPI Fun41Proc(LPVOID lpParameter){

	while (true)
	{
		EnterCriticalSection(&g_cs);
		if (tickets4 > 0){
			cout << "thread1 sell ticket" << tickets4-- << endl;
			LeaveCriticalSection(&g_cs);
		}
		else{
			LeaveCriticalSection(&g_cs);
			break;
		}
	}
	return 0;
}

DWORD WINAPI Fun42Proc(LPVOID lpParameter){

	while (true)
	{
		EnterCriticalSection(&g_cs);

		if (tickets4 > 0){
			cout << "thread2 sell ticket" << tickets4-- << endl;
			LeaveCriticalSection(&g_cs);
		}
		else{
			LeaveCriticalSection(&g_cs);
			break;
		}
	}
	return 0;
}
这个关键代码段其实和我们在银行自动取款机取钱时一样的,我们在进入ATM取钱时,首先看有没有人正在取,如果有人在取得话,我们等当前这个人取完以后,他会就会离开并通知我们可以取钱了,这样就形成了线程的同步。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

余莫星辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值