首页/新闻资讯/正文详情

Win32临界区

发布时间:2026/9/23 10:06:51 来源:云帆数科 栏目:资讯中心
Win32临界区
线程安全问题变量存储特点局部变量存在线程自己的栈空间每个线程独立副本多线程互不干扰天然线程安全全局变量 / 堆变量存全局地址空间所有线程共享同一份数据会产生线程安全问题✅产生线程安全问题两个必要条件必须同时满足多个线程访问同一个共享资源访问中包含写操作修改只有读、没有写不会出现线程安全问题售票案例竞态条件DWORD g_dwTickets10;//多个线程同时执行这段代码while(g_dwTickets0){printf(还有%d张票\n,g_dwTickets);g_dwTickets--;printf(卖出一张还有%d张\n,g_dwTickets);}故障现象重复卖票、票数变成负数根本原因检查和修改不是原子操作 线程可以在任意 CPU 指令间隙发生线程切换示例流程线程 A 判断 g_dwTickets0此时票数 1时间片到线程切换线程 B 抢到 CPU完整执行判断、自减票数变为 0切回线程 AA 继续执行g_dwTickets–票数直接变成 ‑1竞态条件程序结果依赖线程调度切换时机结果不可预测临界资源、临界区临界资源同一时刻只允许一个线程访问的共享资源全局变量、共享内存都属于临界资源临界区操作临界资源的那一段代码目标保证同一时间最多只有一个线程执行临界区代码自己手写 if 判断令牌不行判断 赋值两条 C 语句会被线程切换打断依旧有竞态Windows 同步 API 底层依靠 CPU 硬件原子指令保证操作不可打断CRITICAL_SECTION 临界区对象用户态锁API 函数//初始化临界区对象voidInitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection);//进入临界区获取锁拿令牌拿不到就阻塞等待voidEnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);//离开临界区释放锁归还令牌voidLeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);使用完整步骤定义全局 / 堆上 CRITICAL_SECTION cs;❗不能是局部栈变量多个线程要访问同一个锁对象主线程调用 InitializeCriticalSection(cs); 初始化所有读写共享变量的代码包括 if/while 判断全部包裹在 Enter ~ Leave 之间操作完成调用LeaveCriticalSection(cs);释放锁错误写法//错误判断在临界区外面while(g_dwTickets0){EnterCriticalSection(cs);g_dwTickets--;LeaveCriticalSection(cs);}while 判断读取共享变量没有上锁切换依然会出现竞态正确写法while(1){EnterCriticalSection(cs);if(g_dwTickets0){g_dwTickets--;printf(卖出一张剩余%d\n,g_dwTickets);LeaveCriticalSection(cs);}else{LeaveCriticalSection(cs);break;}}临界区使用权衡锁范围太小部分共享变量操作没上锁线程安全失效锁范围太大临界区内代码执行久其他线程大量等待并发性能下降CRITICAL_SECTION 关键特性用户态同步对象不是内核对象不能用CloseHandle不需要句柄销毁使用DeleteCriticalSection()同一个线程可以多次 EnterCriticalSection递归锁内部维护引用计数Enter 几次就必须 Leave 几次只用于同一个进程内部多线程同步不能跨进程使用获取不到锁的线程会阻塞总结局部变量在栈线程私有安全全局 / 堆共享多线程写会出问题线程安全两个条件多线程访问同一资源 存在写操作。只读不会出问题竞态条件检查和修改不是原子线程在中间切换逻辑错乱CRITICAL_SECTION临界区用户态锁仅本进程内使用不能跨进程所有对共享变量的判断、读写全部要包裹在 Enter‑Leave 中间不能把判断放锁外面Enter 几次就要 Leave 几次不能遗漏 Leave否则其他线程永久卡死等待#includewindows.h#includestdio.hCRITICAL_SECTION g_cs;DWORD g_ticket10;DWORD WINAPISellTicket(LPVOID p){while(TRUE){EnterCriticalSection(g_cs);if(g_ticket0){g_ticket--;printf(线程%X卖出一张剩余%d\n,GetCurrentThreadId(),g_ticket);LeaveCriticalSection(g_cs);}else{LeaveCriticalSection(g_cs);break;}}return0;}intmain(){InitializeCriticalSection(g_cs);HANDLE h1CreateThread(NULL,0,SellTicket,NULL,0,NULL);HANDLE h2CreateThread(NULL,0,SellTicket,NULL,0,NULL);WaitForSingleObject(h1,INFINITE);WaitForSingleObject(h2,INFINITE);CloseHandle(h1);CloseHandle(h2);DeleteCriticalSection(g_cs);return0;}

相关推荐

如何有效控制装修成本?行业问答解析
如何有效控制装修成本?行业问答解析

在装修过程中,成本控制是业主普遍关心的问题。合理规划预算、明确费用构成以及选择合适的设计服务,是实现成本有效管理的关键。 一、装修成本通常包含哪些主要部分? 装修成本主要由以下几个部分构成: 设计费用:包括平面… · 2026/9/23 10:06:45

linghun 国产自研AI编程终端实测:Terminal-Bench 2.1 官方 89 题 73.03% 通过率,TaoToken 统一 Key 配置全记录
linghun 国产自研AI编程终端实测:Terminal-Bench 2.1 官方 89 题 73.03% 通过率,TaoToken 统一 Key 配置全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/23 10:06:45

Agent Orchestrator 的 AGENTS.md 操作契约全解:从仓库布局到硬性边界的智能体协作指南
Agent Orchestrator 的 AGENTS.md 操作契约全解:从仓库布局到硬性边界的智能体协作指南

Agent Orchestrator 的 AGENTS.md 操作契约全解:从仓库布局到硬性边界的智能体协作指南 【免费下载链接】agent-orchestrator Run and supervise teams of coding agents from planning to merge. Any harness (Claude code, codex, 25 more). Desktop, web, mobile… · 2026/9/23 10:06:45

中文短文本情感分析实战:基于PyTorch的LSTM模型搭建与调优指南
中文短文本情感分析实战:基于PyTorch的LSTM模型搭建与调优指南

简介:一套基于LSTM的中文短文本情感分析项目源码,主要面向需要完成期末大作业、课程设计的高校学生,也适合刚接触深度学习文本分类的Python开发者用于练手与拓展。压缩包共14个文件、大小约1.96MB,内部包含Python源码脚本、训练与… · 2026/9/23 10:55:40

基于SQLite与三层容错架构的内容获取工作流重构实践
基于SQLite与三层容错架构的内容获取工作流重构实践

1. 内容获取工作流的核心痛点与重构思路做过内容批量采集的人都有一个共识:真正让人头疼的从来不是“能不能下载”,而是“下载过程稳不稳”。douyin-downloader 这类工具在圈子里流传已久,早期版本大多走的是单链路请求——解析一个视频 ID&a… · 2026/9/23 10:55:40

数字绘画笔刷管理:从参数原理到高效工作流
数字绘画笔刷管理:从参数原理到高效工作流

1. 项目概述:一个手绘爱好者的工具进化史五年前刚接触数字绘画时,我和大多数新手一样陷入"笔刷收藏癖"的怪圈——硬盘里囤积了上百套笔刷却从未认真使用过任何一套。直到有次接商业项目时,甲方要求用特定风格的笔触完成整套插画&am… · 2026/9/23 10:55:40

盾构隧道有限元分析:抗震与防水关键技术解析
盾构隧道有限元分析:抗震与防水关键技术解析

1. 盾构隧道有限元分析的核心价值在地下工程领域,盾构隧道设计一直是个复杂的技术活。记得我刚入行时,老师傅们都是靠经验公式和简化计算来评估隧道性能,现在有了ABAQUS和COMSOL这类有限元分析工具,我们可以建立完整的数字模型&am… · 2026/9/23 10:55:40

揭开SGD的神秘面纱:随机梯度下降的“随机”到底指什么?
揭开SGD的神秘面纱:随机梯度下降的“随机”到底指什么?

开门见山问一句:SGD 的“随机”到底随机在哪?很多人的第一反应是“随机抽样本”,再追问“那为什么随机抽样本反而比用全部样本效果好?”,答上来的人就少了一大半。我这些年面试算法岗,简历上十个有九个写“… · 2026/9/23 10:55:40

网络热词“cua”为何刷屏?从拟声词到万能梗的传播密码
网络热词“cua”为何刷屏?从拟声词到万能梗的传播密码

那天刷到一个视频,评论区齐刷刷地打“cua”,一开始我以为是什么新梗又没跟上,结果翻了几十条才明白,就是那个一声响、一记暴击、一个让人没反应过来的转折,都可以叫“cua”。说真的,这个词没有固定写法、没… · 2026/9/23 10:55:34

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码