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

你可能感兴趣的文章
PHP
查看>>
Regular Expression Notes
查看>>
PHP $FILES error码对应错误信息
查看>>
PHP $_FILES函数详解
查看>>
PHP $_SERVER['HTTP_REFERER'] 获取前一页面的 URL 地址
查看>>
php &amp; 和 &amp;amp; (主要是url 问题)
查看>>
php -- 魔术方法 之 判断属性是否存在或为空:__isset()
查看>>
php -- 魔术方法 之 获取属性:__get()
查看>>
php -树-二叉树的实现
查看>>
PHP -算法-二路归并
查看>>
php 2条不一样 的json数据 怎么放在一个json里面_如果你是PHP开发者,请务必了解一下Composer...
查看>>
php 360 不记住密码,JavaScript_多种方法实现360浏览器下禁止自动填写用户名密码,目前开发一个项目遇到一个很 - phpStudy...
查看>>
regExp的match、exec、test区别
查看>>
php 404 自定义,APACHE 自定义404错误页面设置方法
查看>>
PHP 5.3.0以上推荐使用mysqlnd驱动
查看>>
php 7.2 安装 mcrypt 扩展: mcrypt 扩展从 php 7.1.0 开始废弃;自 php 7.2.0 起,会移到 pecl...
查看>>
php aes sha1解密,PHP AES加密/解密
查看>>
php array 分片,PHP常用数组函数小结
查看>>
php CI框架单个file表单多文件上传例子
查看>>
php composer
查看>>