我的世界做图的网站/百度公司的业务范围
多线程(5)多线程同步之临界区(windows实现)
- 1. 什么是临界资源,临界区?
- 2.临界区的特点
- 2. 接口(windows实现)
- 3. 例子-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