多线程(C++)临界区Critical Sections

一 、Critical Sections(功能与Mutex相同,保证某一时刻只有一个线程能够访问共享资源,但是不是内核对象,所以访问速度比Mutex快,但是没有等待超时的功能,所以有可能导致死锁,使用要小心)

 

    当多个线程访问一个独占性共享资源时,可以使用“临界区”对象。任一时刻只有一个线程可以拥有临界区对象,拥有临界区的线程可以访问被保护起来的资源或代码段,其他希望进入临界区的线程将被挂起等待,直到拥有临界区的线程放弃临界区时为止,这样就保证了不会在同一时刻出现多个线程访问共享资源。

CCriticalSection类的用法非常简单,步骤如下:

  1. 定义CCriticalSection类的一个全局对象(以使各个线程均能访问),如CCriticalSection critical_section;
  2. 在访问需要保护的资源或代码之前,调用CCriticalSection类的成员Lock()获得临界区对象:
    critical_section.Lock();
    在线程中调用该函数来使线程获得它所请求的临界区。如果此时没有其它线程占有临界区对象,则调用Lock()的线程获得临界区;否则,线程将被挂起,并放入到一个系统队列中等待,直到当前拥有临界区的线程释放了临界区时为止。
  3. 访问临界区完毕后,使用CCriticalSection的成员函数Unlock()来释放临界区:
    critical_section.Unlock();
  4. 再通俗一点讲,就是线程A执行到critical_section.Lock();语句时,如果其它线程(B)正在执行 critical_section.Lock();语句后且critical_section. Unlock();语句前的语句时,线程A就会等待,直到线程B执行完critical_section. Unlock();语句,线程A才会继续执行。
  5. 注意事项

     1) 因为Critical Sections不是内核对象,所以只能用来统一进程内线程间的同步,不能用来多个不同进程间的线程的同步。

     2) 如果在Critical Sections中间突然程序crash或是exit而没有调用LeaveCriticalSection,则结果是改线程所对应的内核不能被释放,该线程成为死线程。

     3) 要比其他的内核对象的速度要快。

二、使用CriticalSections的简单实例,Stack在push的时候可以分为3个步骤,看下面的代码,但是如果在第2步后此线程中断切换到其他的线程,其他的线程push后再返回执行时,此线程继续执行,这样有可能刚才其他线程push就会被覆盖了,在stack里找不到了。(下面的代码在 debug下使用了CriticalSection,release下可能有问题)

转载于:https://www.cnblogs.com/ct0421/p/4024416.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299029.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

由社区推动的 .NET 6 新 API

原文:bit.ly/3ykXfgJ作者:David Fowler翻译:精致码农-王亮.NET 6 即将到来,我想分享一些我最喜欢的 .NET 和 ASP.NET Core 中的新 API,你一定会喜欢,因为它们是由我们优秀的 .NET 开发者社区推动的。让我们…

启动与停止mysql服务的命令

在“运行”中运行如下命令:启动mysql: net start mysql 停止mysql: net stop mysql 转载于:https://www.cnblogs.com/qiantuwuliang/archive/2009/07/12/1521921.html

hash算法_到底什么是Hash?Hash算法的原理和实际应用讲解

提到hash,相信大多数同学都不会陌生,之前很火现在也依旧很火的技术区块链背后的底层原理之一就是hash,下面就从hash算法的原理和实际应用等几个角度,对hash算法进行一个讲解。1、什么是HashHash也称散列、哈希,对应的英…

java 子类 复制_关于java子类继承来的属性与方法究竟是完全复制还是共用使用...

关于java子类继承来的属性与方法究竟是完全复制还是共用使用关于java子类继承来的属性与方法究竟是完全复制还是共用使用今天在学习java的面向对象时,无意间发现一个问题。public class testEquals{public static void main(String[] args){Child cd1 new Child();…

关于IE某些原因导致下拉列表弹出阻止窗口的解决办法

找个N多方案,未果。最终还是重新安装IE解决。 原因可能是因为我同时安装的IE6,IE7共存导致的。转载于:https://www.cnblogs.com/23shi/archive/2010/09/29/1838747.html

女生会 P 的可不仅仅是丰胸和瘦腿......

1 打死你都想不到女生还有这种操作▼2 小朋友的大哥式道歉▼3 可能舌头和尾巴对猫来说也是另一种生物吧?▼4 当代年轻人的发际线▼5 这一招江湖上俗称“老汉推车”▼6 身正不怕影子斜人正不怕车子歪▼7 这位大爷太过于自信了▼你点的每个赞,我都认…

何时使用领域驱动设计

何时使用领域驱动设计?其实当你的应用程序架构设计是面向业务的时候,你已经开始使用领域驱动设计了。领域驱动设计既不是架构风格(Architecture Style),也不是架构模式(Architecture Pattern)&a…

使用MOM 2005监视DC的磁盘空间

在使用MOM 2005监视DC的磁盘空间之前首先需要在MOM 2005服务器上导入Active Directory的管理包,这样MOM 2005服务器才能够对域控制器进行管理 我来到一台计算机名称叫做MOM2005的计算机 它是一台MOM 2005管理服务器同时是一台MOM 2005报表服务器 打开MOM 2005管理控制台--按管…

php如何读出xml的节点内容 两个例子

第一个例子: PHP与XML联系紧密,下面是一个较简单的解析XML节点数据的例子,示例中自定义有一个XML样例文件代码,通过PHP将依次读取出XML节点中的id、name和email数据,是读取较大的XML文件的前提,新手的话&am…

java递归 treeview_treeview递归

1.数据库table A(ID int pk,Value varchar,Fid int)A:ID Value Fid1 value1 02 value2 03 value3 14 vlaue4 15 value5 26 value6 22.递归void BindTree(TreeNodeCollection tnc,string fid){DataView dvds.Tables[0].DefaultView;//…

latex 1图加标题_使用VsCode编译latex心得

本人最早接触latex是刘海洋老师的《latex入门》,大家可自行搜索相关资源查阅,可以作为参考书,不建议从头到尾的翻阅学习。学习窍门在配置好相关软件之后,应当立即编译一个模板,保证能通过。相关的模板如IEEE等学术报告…

Microsoft AJAX Client Library规范的实例

MSDN 帮助: ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/dv_vwdcon/html/285e3a65-b42e-42c5-952d-baf184057899.htm Type.registerNamespace("Demo"); Demo.Person function(firstName, lastName, emailAddress) {this._firstName firstName;this._last…

这就是为什么上帝和魔鬼都喜欢数学......

全世界只有3.14 % 的人关注了爆炸吧知识是上帝的指纹还是魔鬼的聚合物两千多年来,几何学的研究主要集中在欧几里得几何上。正因如此,欧式几何中由直线或曲线、平面或曲面、平直体或曲体所构成的各种几何形状,一直是人类认识自然物体形状的有力…

彻底删除 XP 自带的 Windows Messenger方法

开始->运行->RunDll32 advpack.dll,LaunchINFSection %windir%\INF\msmsgs.inf,BLC.Remove 就这么简单 鲜为人知的安装和卸载绝技:巧用Rundll32.exe在Windows系统中安装和卸载程序是件非常容易的事情,一般用户通过安装和卸载程序向导就…

反向压力

大家好,我是鱼皮,今天分享一个实用的编程小知识 —— 反向压力。在介绍反向压力前,我们先聊聊什么是压力?什么是压力?我是一个打工人,日常工作就是听产品经理的话,写代码做需求。正常打工正常情…

2×3卡方检验prism_卡方独立性检验原理

这篇文章主要讲了两个部分,一个是卡方检验的推导,一个是卡方检验应该取多少样本量。卡方独立性检验是为了检验两个变量是否独立,我们先来回顾一下卡方独立性检验的流程:1、统计列联表,计算观察值:表一图中的…

不断电系统的容量如何计算?

不断电系统的容量如何计算?  1.目前市面上销售的不断电系统大都以VA(视在功率)为单位,V表示电压,A表示电流,电压乘以电流就表示功率,也就是不断电系统的容量;以一部500VA的不断电系统来说明,当…

AVL树----java

AVL树----java AVL树是高度平衡的二叉查找树 1.单旋转LL旋转 理解记忆&#xff1a;1.在不平衡的节点的左孩子的左孩子插入导致的不平衡&#xff0c;所以叫LL private AVLTreeNode<T> leftLeftRotation(AVLTreeNode<T> k2) {AVLTreeNode<T> k1;k1 k2.left;k2…

其实你女朋友也不是很爱你...

1 你玩她口红化妆品试试▼2 我妈介绍的相亲对象优点&#xff1a;每天主动问早缺点&#xff1a;每天只问早▼3 女儿过度高估老爸了▼4 国际油价暴跌全军出击买买买▼5 有人喜欢我吗&#xff1f;我爱吃炸鸡▼6 有厕纸的那部分人还有全球百分之50的双黄连▼7 其实生物书比较…

Gestalt - 在浏览器里用 python/ruby 写客户端脚本

Gestalt 是 Mix Online Lab 创造出来的一个框架&#xff0c;利用它我们可以在浏览器里用 python/ruby 写脚本来操纵 DHTML 的各种对象&#xff0c;其作用就跟 javascript 类似。一个例子&#xff1a;<script language"javascript"src"gestalt.js"/>&…