滴水 2.24 临界区

1.线程安全

1、多线程访问全局变量时,存在线程安全问题.
2.临界区
image
1.临界资源:多个执行流都能看到并能访问的资源,临界资源
2.临界区:多个执行流,代码中,有不同的代码,但访问临界资源的代码,我们称之为临界区
临界区的使用
CRITICAL_SECTION cs;//创建
InitializeCriticalSection(&cs);//初始化
固定操作
EnterCriticalSection(&cs);
对变量X的操作
LeaveCriticalSection(&cs);

image

临界区对象的资源
image

点击查看代码
#include<stdio.h>
#include<Windows.h>

int sum = 0;
CRITICAL_SECTION cs;
CRITICAL_SECTION csb;
DWORD WINAPI ThreadProc(
	LPVOID lpParameter   // thread data					
)
{
	
	int i = 0;
	while(i<100000)
	{
		EnterCriticalSection(&cs);
		sum++;
		LeaveCriticalSection(&cs);
		i++;
		
	}


	return 0;
}

DWORD WINAPI ThreadProc2(
	LPVOID lpParameter   // thread data					
)
{
	
	int i = 0;
	while (i < 100000)
	{
		EnterCriticalSection(&cs);
		sum++;
		LeaveCriticalSection(&cs);
		i++;


		}
		sum++;

	

	return 0;
}

int main()
{

	InitializeCriticalSection(&cs);

	//创建一个新的线程							
	HANDLE hThread = ::CreateThread(NULL, 0, ThreadProc,
		NULL, 0, NULL);
	HANDLE pq = ::CreateThread(NULL, 0, ThreadProc2,
		NULL, 0, NULL);
	//如果不在其他的地方引用它 关闭句柄							
	
	

	while (1)
	{
		Sleep(500);
		printf("%d\n", sum);

	}

	return 0;
}

临界区优化代码

临界区
	下面的代码哪里有问题:
	资源极度浪费 影响线程运行
	
	全局变量X
	全局变量Y
	全局变量Z
	
	线程1
	DWORD WINAPI ThreadFunc(PVOID pvParam) 
	{
	   EnterCriticalSection(&g_cs);
	   使用X
	   使用Y
	   LeaveCriticalSection(&g_cs);
	   return(0);
	}
	
	线程2
	DWORD WINAPI ThreadFunc(PVOID pvParam) 
	{
	   EnterCriticalSection(&g_cs);
	   使用X
	   使用Z
	   LeaveCriticalSection(&g_cs);
	   return(0);
	}
	
	线程3
	DWORD WINAPI ThreadFunc(PVOID pvParam) 
	{
	   EnterCriticalSection(&g_cs);
	   使用Y
	   使用X
	   LeaveCriticalSection(&g_cs);
	   return(0);
	}
	
	
	解决方案:
	
	
	CRITICAL_SECTION g_csX; 
	CRITICAL_SECTION g_csY; 
	CRITICAL_SECTION g_csZ; 
	
	线程1
	DWORD WINAPI ThreadFunc(PVOID pvParam) 
	{
	   EnterCriticalSection(&g_csX);
	   使用X
	   LeaveCriticalSection(&g_csX);
	   EnterCriticalSection(&g_csY);
	   使用Y
	   LeaveCriticalSection(&g_csY);
	
	   return(0);
	}
	
	线程2
	DWORD WINAPI ThreadFunc(PVOID pvParam) 
	{
	   EnterCriticalSection(&g_csX);
	   使用X
	   LeaveCriticalSection(&g_csX);
	   EnterCriticalSection(&g_csZ);
	   使用Z
	   LeaveCriticalSection(&g_csZ);
	
	   return(0);
	}
	
	线程3
	DWORD WINAPI ThreadFunc(PVOID pvParam) 
	{
	   EnterCriticalSection(&g_csX);
	   使用X
	   LeaveCriticalSection(&g_csX);
	   return(0);
	}
单临界区使得 可以跳执行其他线程

临界区死锁
image

我觉得不是死锁 等后续复习再来搞定

posted @   逆向狗  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示