首先,看概念:关键代码段,也称为临界区,工作在用户方式下。它是指一小段代码段,在代码能够执行前,它必须独占对某些资源的访问权。
了解完概念,同样看4个函数原型:
(1)InitializeCriticalSection()初始化关键代码段
LPCRITICAL_SECTION结构体类型的对象,临界资源对象指针
(2)DeleteCriticalSection()释放一个没有被任何线程所拥有的临界区对象的所有资源
LPCRITICAL_SECTION结构体类型的对象,临界资源对象指针
(3)EnterCriticalSection()进入关键代码段
LPCRITICAL_SECTION结构体类型的对象,临界资源对象指针
(4)LeaveCriticalSection()释放指定的临界区对象的所有权
LPCRITICAL_SECTION结构体类型的对象,临界资源对象指针
上代码:
了解完概念,同样看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取钱时,首先看有没有人正在取,如果有人在取得话,我们等当前这个人取完以后,他会就会离开并通知我们可以取钱了,这样就形成了线程的同步。