handler原子锁_多线程编程之原子锁

在《多线程编程之数据访问互斥》一文中简单介绍了原子锁,这里再详细说一下原子锁的概念和用途。

(1)简单数据操作

如果在一个多线程环境下对某个变量进行简单数学运算或者逻辑运算,那么就应该使用原子锁操作。因为,使用临界区、互斥量等线程互斥方式将涉及到很多操作系统调用和函数调用等,效率肯定不如原子操作高。比如有这样一个例子:

unsigned int count = 0;intdata_process()

{if(/*conditions*/){

EnterCriticalSection(&cs);++count;

LeaveCriticalSection(&cs);

}

}

这里只有简单的数学操作,完全可以应用操作系统提供的原子操作来替代,效率会高不少:

unsigned int count = 0;intdata_process()

{if(/*conditions*/){

InterLockedIncrement (&count);

}

}

(2)代码段中的互斥

还是以临界区为例,比如在代码段中应用到了如下的临界区:

voiddata_process()

{

EnterCriticalSection(&cs);

do_something();

LeaveCriticalSection(&cs);

}

这里其实也可以利用原子锁来代替临界区,实现方式如下:

unsigned int lock = 0;voiddata_process()

{while(1 == InterLockedCompareExchange(&lock, 1, 0));

do_something();lock = 0;

}

InterLockedCompareExchange方法的含义是:将第一个参数的值与第三个参数的值进行比较,如果相等则与第二个参数的值进行交换,如果不相等则不进行操作;返回值为第一个参数的初始值,该函数所进行的操作为原子操作,不会被多线程中断,可适用于所有CPU。

上面的代码含义就是不断监测lock的值,当lock值为0时,InterLockedCompareExchange就会将其变为1,并执行do_something(),最后将lock还原为0。当然,如果lock此时为1,这个while循环就会不断地执行(“忙等”)。

其实说到这里,我们就会发现这里有一个问题:如果另外有一个线程将lock变为1并且需要执行很长的时间,那么这里岂不成了疯等?没错,所以说这种原子锁方法适用于短时间操作线程的互斥场合,并不能替代所有系统互斥锁调用场合。临界区在此时就会表现得更有优越性。

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

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

相关文章

python统计中文字符的个数_python统计中文字符数量的两种方法

方法一: def str_count(str): 找出字符串中的中英文、空格、数字、标点符号个数 count_en count_dg count_sp count_zh count_pu 0 for s in str: # 英文 if s in string.ascii_letters: count_en 1 # 数字 elif s.isdigit(): count_dg 1 # 空格 elif s.issp…

测井储层参数预测+人工智能方法

1 问题描述 测井储层参数预测 地层泥质含量;地层孔隙度(POR);含水饱和度(SW);渗透率(PERM)。 输入:声波时差(AC)、补偿中子&#x…

php spry文本域_Spry框架及验证构件

图9-71Spry框架原理虽然这些文件存放在服务器上,但实际上是被加载到浏览器中运行的。框架的用户将所有需要的文件链接到HTML文档中,以使用不同的组件,来获得更丰富的用户体验。Spry框架是和设计人员紧密相关的,因此框架中的每个元…

网络系统安全课程--目录

本系列教程以《网络与系统安全》为基础,希望在大家的帮助下,逐步完善网络与系统安全研究生课程。 1 经典攻击分析 1.1 中间人攻击 1.2 源替换攻击 1.3 消息重放攻击 1.4 平行会话攻击 1.5 反射攻击 1.6 交错攻击 1.7 类型缺陷攻击 1.8 身份标识省略导致…

windows 安装openssh服务端_Git神器| SourceTree安装使用教程

SourceTree 是 Windows 和Mac OS X 下免费的Git客户端管理工具。支持创建、克隆、提交、push、pull 和合并等操作。一、sourcetree的安装1. 下载sourcetree下载链接:Sourcetree | Free Git GUI for Mac and Windows2. 安装sourcetree点击安装,第一个创建…

c语言小学生四则运算出题_软件工程第一次作业,小学生四则运算的出题程序...

一、背景阿超有个儿子上小学二年级,老师每天让家长给孩子出30道加减法题,虽然不多,但是每天都做也算是个负担,阿超作为一个老牌程序员当然想用计算机来解决这个小问题,目前对于这个问题对于任何语言都不是问题&#xf…

中国大学生计算机设计大赛--软件应用与开发类--经验总结

1 大赛介绍 中国大学生计算机设计大赛是我国高校面向本科生最早的赛事之一,自2008年开赛至2019年,一直由教育部高校与计算机相关教指委等或独立或联合主办。此赛目前是全国普通高校大学生竞赛排行榜榜单赛事之一。 我们参加了很多届大赛,在2…

python如何使用ppip安装xlwt_Python-xlwt库的基本使用

安装xlwt库 pip install xlwt 基本使用 ①创建工作簿 wa xlwt.Workbook() ②添加工作表 添加“class”工作表 b wa.add_sheet(class) ③向工作表写入数据 注释:(0,0,姓名)(行、列、内容)第0行的第0个也就是excel中的A1,(0,1)就是B1..... b.write(0,0,姓…

网络与系统安全1.1 中间人攻击

1 Diffie-Hellman密钥交换过程 2 中间人攻击过程

tomcat启动占了12g_tomcat服务为何报内存相关错误??

本帖最后由 linux_love 于 2014-9-19 11:46 编辑多谢各位英雄支持,这个问题困扰我N久了,昨天终于让我给拿下了,在Linux下有个CommitLimit 用于限制系统应用使用的内存资源,#grep -i commit /proc/meminfoCommitLimit: 20389524…

python调用键盘_使用 Python 控制自己的电脑和键盘是一种什么样的体验?

可能有时候你需要在电脑做一些重复的点击或者提交表单等操作,如果能通过 Python 预先写好相关的操作指令,让它帮你操作,然后你自己爱干嘛干嘛去,有点 “按键精灵” 的意思,是不是感觉有点爽呢? 那么如何使用…

网络与系统安全4.1 基于随机搜索的黑盒对抗攻击方法

1 摘要 神经网络模型容易受到对抗样本的攻击,根据攻击者是否能获取到模型内部参数可以把攻击类型分为白盒攻击和黑盒攻击。 白盒攻击比较常见,但其对目标模型的威胁程度要远低于黑盒攻击。传统黑盒攻击往往都是基于梯度实现的,并且具有查询…

mybatis 二级缓存失效_二级缓存updateBatchById失效

### 当前使用版本(必须填写清楚,否则不予处理)3.3.0### 该问题是怎么引起的?**([最新版](https://search.maven.org/search?qg:com.baomidou%20a:mybatis-*)上已修复的会直接**close**掉)**### 重现步骤**字典mapper**CacheNamespacepublic interface D…

centos 安装jdk_centos7配置jdk

一、查看centos7是否有自带jdk查看是否安装过java rpm -qa | grep java 如果是centos 一般会自带两个openjdk rpm -e --nodeps 要卸载的包 (包通过上面的指令可以获取到)] 将显示java的包全都卸载 命令: rpm -e --nodeps 要卸载的包二、创建/opt/app目录,用于安装JD…

隐私计算 1 隐私计算的定义与背景

1 隐私计算的定义 隐私计算:在保证数据提供方不泄露原始数据的前提下,对数据进行分析计算的一系列技术,保障数据在流通和融合过程中“可用不可见”。 隐私计算涉及到的学科: 密码学;统计学;计算机体系结…

php object 对象不存在。增加对象_PHP核心

1、单例模式单例模式三要素&#xff1a;拥有一个构造函数&#xff0c;并且为private拥有一个静态成员变量来保持类的实例拥有一个访问这个实例的静态方法<?php //Instan.php 单例类class Instan{static public $instance null;private function __construct(){var_dump(…

数据库查询求小于_SQL学习笔记(二)简单查询

本篇主要学习如何通过简单查询获取想要的数据。从零学会SQL&#xff1a;简单查询​www.zhihu.com基本的查询语句从数据库中查找数据时要使用select子句&#xff0c;select子句是sql中使用最多、最基本的子句。子句是sql语句的组成要素&#xff0c;是以某一个关键字作为开始的语…

隐私计算 2.1秘密共享--问题模型及定义

1 秘密共享问题模型 1.1 富翁和三个儿子的故事 问题&#xff1a; 富翁想在自己的三个儿子中找一个最聪明的来继承自己的遗产&#xff0c;在保护好财富的同时&#xff0c;让其他两个人也参与进来&#xff0c;使得兄弟间和睦相处&#xff0c;家庭和谐。 大儿子的方案&#xff…

为什么手机上传图片这么慢 前端_为什么手机上传速度那么慢?

展开全部1、是由于手机内部存储器写入e69da5e6ba9062616964757a686964616f31333365633861速度慢导致的。可以更换速度更快的内部存储器来解决。2、如果是将手机直接用数据线连到电脑&#xff0c;一般传送文件很慢&#xff0c;这是因为手机的通讯端口波特率限制的&#xff0c;虽…

如何命令行结束react程序_想要成为前端Star 吗?一首歌时间将React / Vue 应用Docker 化...

前言 以前一直有疑问困扰着我&#xff1a;人人都在吹的Docker容器化&#xff0c;与前端有何关系&#xff1f;然而在近两年的编程生涯&#xff0c;在每一次产品迭代中&#xff0c;渐渐体会到了容器化其魅力所在。应用部署从刀耕火种&#xff0c;到DevOps崛起&#xff0c;原来不止…