多线程(5)多线程同步之临界区(windows实现)
1. 什么是临界资源,临界区?
-
临界资源
多线程之间可能需要互斥的访问一些全局变量,这就需要互斥的来访问,这些需要共享访问的字段被称作是 临界资源 -
临界区
就是访问临界资源的那一段代码称作临界区
2.临界区的特点
- 临界区在任意时刻只允许一个线程对共享资源进行访问。
- 如果有多个线程试图同时访问临界区,那么有线程进入后,其他线程试图访问时将被挂起,直到进入临界区的线程离开。
2. 接口(windows实现)
1. CRITICAL_SECTION &sec; //申请一个临界区资源对象
2. InitializeCriticalSection(&sec);//初始化临界区对象
3. EnterCriticalSection(&sec); //进入临界区
4. LeaveCriticalSection(&sec); //离开临界区
5. DeleteCriticalSection(&sec); //释放临界区
3. 例子-windows
#include "iostream"
#include "windows.h"
using namespace std;
CRITICAL_SECTION criSec;
static HANDLE g_mutex = INVALID_HANDLE_VALUE;
static int g_iShareNum=10;
DWORD WINAPI threadCriticalSecTestOne(LPVOID lp)
{
cout<<"----thread 1 start----"<<endl;
while (1)
{
EnterCriticalSection(&criSec);
if (g_iShareNum>0)
{
cout<<"thread 1 sell "<<g_iShareNum<<endl;
g_iShareNum--;
//Sleep(100);
}else
{
LeaveCriticalSection(&criSec);
return 0;
}
LeaveCriticalSection(&criSec);
Sleep(100);
}
return 0;
}
DWORD WINAPI threadCriticalSecTestTwo(LPVOID lp)
{
cout<<"----thread 2 start----"<<endl;
while (1)
{
EnterCriticalSection(&criSec);
if (g_iShareNum>0)
{
cout<<"thread 2 sell "<<g_iShareNum<<endl;
g_iShareNum--;
//Sleep(100);
}else
{
LeaveCriticalSection(&criSec);
return 0;
}
LeaveCriticalSection(&criSec);
Sleep(100);
}
return 0;
}
void testCriticalSec(){
cout<<"----testCriticalSec test start----"<<endl;
InitializeCriticalSection(&criSec);
HANDLE hOne,hWwo;
hOne=CreateThread(NULL,0,threadCriticalSecTestOne,0,0,0);
hWwo=CreateThread(NULL,0,threadCriticalSecTestTwo,0,0,0);
CloseHandle(hOne);
CloseHandle(hWwo);
while (1)
{
if (g_iShareNum==0)
{
cout<<"g_iShareNum =0"<<endl;
DeleteCriticalSection(&criSec);
return;
}
else
{
continue;
}
}
cout<<"----testCriticalSec test end----"<<endl;
return;
}
参考
1. https://blog.csdn.net/qq_41248872/article/details/82991949