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取钱时,首先看有没有人正在取,如果有人在取得话,我们等当前这个人取完以后,他会就会离开并通知我们可以取钱了,这样就形成了线程的同步。

你可能感兴趣的:(windows多线程系列004_利用关键代码段实现线程同步)