博客
关于我
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/

你可能感兴趣的文章
Open-Sora代码详细解读(2):时空3D VAE
查看>>
Open-Source Service Discovery
查看>>
open-vm-tools-dkms : 依赖: open-vm-tools (>= 2:9.4.0-1280544-5ubuntu3) 但是它将不会被安装
查看>>
open3d-Dll缺失,未找到指定模块解决
查看>>
openai Midjourney代理服务 gpt大模型第三方api平台汇总 支持国内外各种大模型 持续更新中...
查看>>
OpenAll:Android打开组件新姿势【仅供用于学习了解ButterKnife框架基本原理】
查看>>
OpenASR 项目使用教程
查看>>
Openbox-桌面图标设置
查看>>
opencart出现no such file or dictionary
查看>>
OpenCV 3.1 imwrite()函数写入异常问题解决方法
查看>>
OpenCV 4.1.0版drawContours
查看>>
Opencv cv2.putText 函数详解
查看>>
opencv glob 内存溢出异常
查看>>
opencv Hog Demo
查看>>
opencv Hog学习总结
查看>>
opencv Mat push_back
查看>>
opencv putText中文乱码
查看>>
OpenCV Python围绕特定点将图像旋转X度
查看>>
opencv resize
查看>>
Opencv Sift和Surf特征实现图像无缝拼接生成全景图像
查看>>