首页 > 其他分享 >互斥技术-原子变量

互斥技术-原子变量

时间:2024-03-06 15:11:57浏览次数:23  
标签:__ 变量 ++ 步骤 原子 互斥 atomic

原子变量

普通变量count++:

看起来是一句话:实际是三个步骤:第一:首先要把这个变量在内存当中取到CPU:第二:把这个变量进行++;第三:把这个变量的值送回内存:所以这是分了三个步骤:每一个步骤都有可能被打断,所以对这个值的操作不原子.

原子:即一气呵成:

一旦成功,则所有过程都成功,一旦失败,所有过程都失败.所以原子变量并不是不可被打断的.

原子变量count++:

也是分成三个步骤:前两个步骤与普通变量一样:第三个步骤:在进行往内存写的时候,会检测是否在我取出之后这个变量被重新写入过,如果被写入过,则重新把这个变量读取出来进行++,然后在写入.(这个功能实现的方式是在下面这个atomic.h中的一段内嵌汇编实现的)

vim arch/arm/include/asm/atomic.h这个头文件是原子变量相关的代码,下面列出一个例子

 39 static inline void atomic_add(int i, atomic_t *v)
 40 {
 41     unsigned long tmp;
 42     int result;
 43 
 44     __asm__ __volatile__("@ atomic_add\n"
 45 "1: ldrex   %0, [%3]\n"
 46 "   add %0, %0, %4\n"
 47 "   strex   %1, %0, [%3]\n"
 48 "   teq %1, #0\n"
 49 "   bne 1b"
 50     : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter)
 51     : "r" (&v->counter), "Ir" (i)
 52     : "cc");
 53 }

插曲:中断除了正在运行的指令不可以打断,其他任何过程都可以打断:在不可抢占的内核的一段代码:在之前屏蔽中断,操作之后再打开中断,这样中间的一段代码是不可能被其他任何情况打断了.

标签:__,变量,++,步骤,原子,互斥,atomic
From: https://www.cnblogs.com/axjlxy/p/18056650

相关文章

  • 实战解析:打造风控特征变量平台,赋能数据驱动决策
    金融业务产品授信准入、交易营销等环节存在广泛的风控诉求,随着业务种类增多,传统的专家规则、评分卡模型难以应付日趋复杂的风控场景。在传统风控以专家规则系统为主流应用的语境下,规则模型的入参习惯被称为“变量”。基于专家规则的风险评估,存在规则触发阈值难量化的特点,规则命中......
  • Mac终端安装Jupyter Notebook,配置环境变量及其相关知识(环境变量相关操作、编辑器、zsh
    目录1.Mac终端安装JupyterNotebook1.1先更新一下pip,然后安装JupyterNotebook1.2配置环境变量1.2.1找到Jupyter的安装位置1.2.2环境变量加到.zshrc2.相关知识2.1环境变量2.2编辑文件2.3zsh和bash2.4.zshrc(.bashrc)文件和.zprofile(.bash_profile)文件的区别1.Mac终......
  • Windwos JDK环境变量一键配置
    上代码@echooff@echo一键配置jdk环境变量@echobywkong、@echo.cd/d%~dp0setmypath=%~dp0REGADD"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\Environment"/vJAVA_HOME/tREG_EXPAND_SZ/d%mypath%/f@echo设置JAVA_HOME..........
  • 变量$host、$http_host、$proxy_host区别
    //如果想让Host是crmtest.aty.sohuno.com,则进行如下设置:proxy_set_headerHostcrmtest.aty.sohuno.com;//如果不想改变请求头“Host”的值,可以这样来设置:proxy_set_headerHost$http_host;//但是,如果客户端请求头中没有携带这个头部,那么传递到后端服务器的请求也不含这个头......
  • 函数提升和变量提升
    1:函数提升优先级高于变量提升,且不会被同名变量声明时覆盖,但是会被同名变量赋值后覆盖,注意看赋值和打印的位置JavaScript中的函数是一等公民,函数声明的优先级最高,会被提升至当前作用域最顶端。如果前面的函数表达式与之前的函数声明同名,后者会将其覆盖。console.log(a)//ƒa......
  • 学java10变量
    1.变量:可以变化的量Java是一种强类型语言,每个变量都必须声明其类型。Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。//数据类型变量名=值;可以使用逗号隔开来声明多个同类型变量(但不建意)inta=1,b=2,c=3;Stringname="lml";charx="X";doubl......
  • python变量命名规范
    简单地理解,标识符就是一个名字,就好像我们每个人都有属于自己的名字,它的主要作用就是作为变量、函数、类、模块以及其他对象的名称。Python中标识符的命名不是随意的,而是要遵守一定的命令规则标识符是由字符(A~Z和a~z)、下划线和数字组成,但第一个字符不能是数字。标识符不能和......
  • 拉普拉斯变换的积分上下限,或者说积分路径,是复数域的,但是w是单变量,一个单变量,怎么能在
       这个的积分上下限,或者说积分路径,是复数域的,但是w是单变量,一个单变量,怎么能在复空间上面积分呢? 做变换后,由一个维度变成两个维度。 ......
  • 原子类
    原子类目录原子类什么是原子类,有什么作用6类原子类纵览Atomic*基本类型,以AtomicInteger为例常用方法Atomic*Array数组类型原子类Atomic*Reference引用类型原子类把普通变量升级为原子类:用AtomicIntegerFieldUpdate升级原有变量Adder累加器Accumulator累加器什么是原子类,有什么作......
  • 8_C#如何判断变量类型
    C#中判断变量类型的两种方法1.GetType()方法GetType()方法用于获取当前实例的准确运行时类型。该方法返回一个Type对象,该对象包含有关该类型的信息,例如类型名称、成员、属性等。示例:publicclassPerson{publicstringName{get;set;}}publicclas......