滴水 2.24 临界区
1.线程安全
1、多线程访问全局变量时,存在线程安全问题.
2.临界区
1.临界资源:多个执行流都能看到并能访问的资源,临界资源
2.临界区:多个执行流,代码中,有不同的代码,但访问临界资源的代码,我们称之为临界区
临界区的使用
CRITICAL_SECTION cs;//创建
InitializeCriticalSection(&cs);//初始化
固定操作
EnterCriticalSection(&cs);
对变量X的操作
LeaveCriticalSection(&cs);
临界区对象的资源
点击查看代码
#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);
}
单临界区使得 可以跳执行其他线程
临界区死锁
我觉得不是死锁 等后续复习再来搞定
本文来自博客园,作者:逆向狗,转载请注明原文链接:https://www.cnblogs.com/Agtw/p/17150997.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理