博客
关于我
Windows 临界区(CRITICAL_SECTION)的使用
阅读量:662 次
发布时间:2019-03-14

本文共 1826 字,大约阅读时间需要 6 分钟。

临界区与同步机制

在多线程环境中,确保临界数据的操作完整性至关重要。Linux系统使用锁来管理临界数据,而Windows则采用临界区(Critical Section)机制。

临界区的定义

临界区是程序中允许多个线程同时执行的代码段,例如自加自减操作等。在多线程环境下,如果不采取保护措施,这些代码段可能导致竞态条件,进而引发数据不一致或死锁问题。因此,需要用互斥机制来确保这些临界区在任何时刻只能被一个线程占有。

互斥与同步机制

互斥与同步是操作系统管理多线程共享资源的核心机制。尽管它们听起来很相似,但二者在实现方式上存在差异。简单来说:

  • 互斥:确保某一临界资源在任何时刻只能被规定数量的线程占用。
  • 同步:通过调度机制,使多个任务按照预定顺序访问共享资源。

在实际操作中,互斥是实现同步的核心手段。三个主要角色包括:

  • 不可独占的共享资源
  • 多个使用者(如线程或进程)
  • 调度者(决定资源访问顺序的核心,可能是内核或应用程序)

重要术语解析

  • 竞态条件:当多个线程同时访问共享资源时,若没有互斥保护,可能导致结果不确定。
  • 临界区:保护程序中需要互斥访问的代码段,使其只能被一个线程占用。

Windows临界区操作

Windows提供了丰富的API来管理临界区:

  • InitializeCriticalSection:创建临界区对象。
  • DeleteCriticalSection:释放临界区资源。
  • EnterCriticalSection: Wait 判断是否可以进入临界区(类似于Linux的锁)。
  • LeaveCriticalSection:退出临界区(类似于Linux的解锁)。

代码示例

以下程序展示了如何在Windows中使用临界区:

#include 
#include
#include
using namespace std;string g.Logf(const string& fmt, ...) { printf(fmt.c_str()); return "";}int counter = 0;CRITICAL_SECTION g_cs;void doit(void* arg) { int i, val; for (i = 0; i < 5000; ++i) { EnterCriticalSection(&g_cs); // 可能重复进入临界区,无需额外保护 val = counter; DoLf("thread %d : %d\n", (int)arg, val + 1); counter = val + 1; LeaveCriticalSection(&g_cs); }}int main(int argc, char* argv) { InitializeCriticalSection(&g_cs); HANDLE hThread1 = CreateThread( NULL, // STA或 apartment 模式 0, //_PRIORITY (LPTHREAD_START_ROUTINE)doit, (void*)1, // 标题 0, // 返回值 NULL); //_ptr economically HANDLE hThread2 = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)doit, (void*)2, 0, NULL); WaitForSingleObject(hThread1, INFINITE); WaitForSingleObject(hThread2, INFINITE); DeleteCriticalSection(&g_cs); return 0;}

运行结果应显示1~10000的连续计数,无重复或跳跃,证明临界区机制的有效性。

转载地址:http://phulz.baihongyu.com/

你可能感兴趣的文章
opencv_core.dir/objects.a(vs_version.rc.obj)‘ is incompatible with i386:x86-64 output
查看>>
opencv——图像缩放1(resize)
查看>>
opencv——最简单的视频读取
查看>>
Opencv——模块介绍
查看>>
OpenCV与AI深度学习 | 2024年AI初学者需要掌握的热门技能有哪些?
查看>>
OpenCV与AI深度学习 | CIB-SE-YOLOv8: 优化的YOLOv8, 用于施工现场的安全设备实时检测 !
查看>>
OpenCV与AI深度学习 | CoTracker3:用于卓越点跟踪的最新 AI 模型
查看>>
OpenCV与AI深度学习 | OpenCV中八种不同的目标追踪算法
查看>>
OpenCV与AI深度学习 | OpenCV图像拼接--Stitching detailed使用与参数介绍
查看>>
OpenCV与AI深度学习 | OpenCV如何读取仪表中的指针刻度
查看>>
OpenCV与AI深度学习 | OpenCV常用图像拼接方法(一) :直接拼接
查看>>
OpenCV与AI深度学习 | OpenCV常用图像拼接方法(三):基于特征匹配拼接
查看>>
OpenCV与AI深度学习 | OpenCV常用图像拼接方法(二) :基于模板匹配拼接
查看>>
OpenCV与AI深度学习 | OpenCV常用图像拼接方法(四):基于Stitcher类拼接
查看>>
OpenCV与AI深度学习 | OpenCV快速傅里叶变换(FFT)用于图像和视频流的模糊检测(建议收藏!)
查看>>
OpenCV与AI深度学习 | PaddleOCR 2.9 发布, 正式开源文本图像智能分析利器
查看>>
OpenCV与AI深度学习 | SAM2(Segment Anything Model 2)新一代分割一切大模型介绍与使用(步骤 + 代码)
查看>>
OpenCV与AI深度学习 | T-Rex Label !超震撼 AI 自动标注工具,开箱即用、检测一切
查看>>
OpenCV与AI深度学习 | YOLO11介绍及五大任务推理演示(目标检测,图像分割,图像分类,姿态检测,带方向目标检测)
查看>>
OpenCV与AI深度学习 | YOLOv10在PyTorch和OpenVINO中推理对比
查看>>