C++多线程同步(采用关键代码段即临界区)

C++多线程同步(采用关键代码段即临界区

#include <Windows.h>
#include <iostream>
using namespace std;

DWORD WINAPI Fun1Proc(LPVOID lpParameter);//线程1入口函数
DWORD WINAPI Fun2Proc(LPVOID lpParameter);//线程2入口函数

int g_tickets = 100;//火车票数量
CRITICAL_SECTION g_CS;//全局关键代码段对象

void main()
{
	InitializeCriticalSection(&g_CS);//初始化关键代码段对象

	//创建线程
	HANDLE hThread1;
	HANDLE hThread2;
	hThread1 = CreateThread(NULL, 0 ,Fun1Proc, NULL, 0, NULL);
	hThread2 = CreateThread(NULL, 0 ,Fun2Proc, NULL, 0, NULL);
	CloseHandle(hThread1);
	CloseHandle(hThread2);

	
	Sleep(4000);//主线程函数静默4秒
	DeleteCriticalSection(&g_CS);//删除关键代码段对象
}

DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
	while (TRUE)
	{
		Sleep(1);
		EnterCriticalSection(&g_CS);//进入关键代码段
		if (g_tickets>0)
		{
			Sleep(1);
			cout<<"thread1 sell ticket: "<<g_tickets--<<endl;
			LeaveCriticalSection(&g_CS);//离开关键代码段
		}
		else
		{
			LeaveCriticalSection(&g_CS);//离开关键代码段
			break;
		}
	}
	return 0;
}

DWORD WINAPI Fun2Proc(LPVOID lpParameter)
{
	while (TRUE)
	{
		Sleep(1);
		EnterCriticalSection(&g_CS);//进入关键代码段
		if (g_tickets>0)
		{
			Sleep(1);
			cout<<"thread2 sell ticket: "<<g_tickets--<<endl;
			LeaveCriticalSection(&g_CS);//离开关键代码段
		}
		else
		{
			LeaveCriticalSection(&g_CS);//离开关键代码段
			break;
		}
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值