C语言学习:原子操作

什么是原子操作?

原子操作是不可分割的,在执行完毕之前不会被任何其它任务或事件中断,可以视为最小的操作单元,因此称为原子操作(个人认为叫"原子级操作更为形象")。
(可以是一条指令,也可以是一系列整体性操作)

在编程语言中一般分为两种情况(两种都应该满足):

1) 在单线程中, 能够在单条指令中完成的操作都可以认为是" 原子操作",因为中断只能发生于指令之间。(多体现在单条汇编指令语句中)

2) 在多线程中,不能被其它进程(线程)打断的操作就叫原子操作。

为什么存在原子操作?

在多核处理器的机器上,对于同一个变量值所存在的内存区域可能被多个CPU短时间内同时访问,从而导致该值得不稳定性。例如在多线程中,初始化i=0,对于i++这个操作,同时有2个线程对其进行了调用则有可能导致第一个线程用时i的值为2。(详解如下)

i++是否为原子操作?

i++的操作分为三步:

①内存访问,读取i变量的值到CPU的寄存器中
②使寄存器中的值+1
③将寄存器中的值写回到内存

由此可见,i++并不是原子操作,在没有线程保护的多线程处理器中,每一步都有可能被外部中断给打断,从而影响到 i 的值。

在上一问中,2个线程同时调用了i++,i直接从0变为2,则极有可能是线程1在寄存器中使得i自增1的同时线程2也在做此操作,因此当取出寄存器中i的值到内存时,i 不知不觉被加了2次。

C语言学习:原子操作相关推荐

  1. go语言学习路线图_2019年最新Go语言学习路线图,三个月带你通关Go语言

    作者:郝林 内容选自:<Go语言核心36讲> 1. 明星大厂热推,岗位需求火热. 最近,Hacker News 发布了 2018 年编程语言的招聘趋势排行榜,其中,Go语言已经反超Java ...

  2. C++语言学习(十二)——C++语言常见函数调用约定

    C++语言学习(十二)--C++语言常见函数调用约定 一.C++语言函数调用约定简介 C /C++开发中,程序编译没有问题,但链接的时候报告函数不存在,或程序编译和链接都没有错误,但只要调用库中的函数 ...

  3. 微软提出CLIPBERT:通过稀疏采样的视频语言学习

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 论文是学术研究的精华和未来发展的明灯.小白决心每天为大家带来经典或 ...

  4. c语言错误的等式,C语言学习中几个常见典型错误分析.docx

    C语言学习中几个常见典型错误分析 打开文本图片集 摘要:C语言是一门优秀,应用广泛的结构化程序设计语言,是中职计算机.机电和电子技术等专业一门理论和实践相结合的课程,教学实践中,学生常觉得c语言难学, ...

  5. 二级C语言学习宝典下载,二级C语言学习宝典

    二级C语言学习宝典app是一款专注于全国二级计算机等级C语言学习所开发的应用软件,它能够给你带来全新的功能板块,让你轻松掌握超多优质的考试训练,享受到手机端做题刷题的畅快体验,让你轻松备考,而且在该软 ...

  6. php7做了哪些优化,PHP语言学习之PHP7做了哪些优化

    本文主要向大家介绍了PHP语言学习之PHP7做了哪些优化,通过具体的内容向大家展示,希望对大家学习php语言有所帮助. 一  zval使用栈内存 在Zend引擎和扩展中,经常要创建一个PHP的变量,底 ...

  7. C语言学习趣事_之_大数运算_加法

    C语言学习趣事_大数运算_之加法 1.引子    在C语言中,因为预定义的自然数类型的大小是有上下限度的,这就决定了在进行数的运算的时候,必然受到限制,同时因为C语言是最接近汇编的一种程序设计语言,并 ...

  8. 攻破c语言笔试与机试难点,如何攻破C语言学习、笔试与机试的难点.doc

    如何攻破C语言学习.笔试与机试的难点 第一节??C语言编程中的几个基本概念1.1? ?? ?#include< >与#include" "? 1.? ?#include ...

  9. c语言 浮点型数据怎么存放,C语言学习之浮点型数据存储

    C语言学习之浮点型数据 浮点数 浮点型数据分为单精度浮点型(float)和双精度浮点型(double). 单精度(float) 单精度浮点值 取值范围:1.2E-38 到 3.4E+38 精度:6 位 ...

  10. r语言electricity数据集_R语言学习10-查看数据

    当我们处理一个新的数据集的时候,第一件事就是要对数据做一个了解.数据的格式是什么?数据的维度是多少?变量名是什么? 变量如何存储? 是否缺少数据? 数据中是否有任何缺陷? 本次课将学习如何使用R的内置 ...

最新文章

  1. python 归一化_几种归一化方法(Normalization Method)python实现
  2. java is a_java中 is - a和 has - a的区别
  3. 正则表达式是匹配模式,要么匹配字符,要么匹配位置
  4. Spring Boot 2.x基础教程:找回启动日志中的请求路径列表
  5. 软件项目管理 需求管理
  6. win10家庭版开启组策略方法
  7. kdj买卖指标公式源码_通达信kdj买卖指标公式
  8. 小程序云开发(二) 上传图片到云服务器、上传图片并展示
  9. html js 邮箱格式,email 格式_JavaScript验证Email邮箱格式的三种方法
  10. 解决安装Steam提示steam需要在线更新问题
  11. 微信备份时提示不在同一个网络
  12. 积分营销系统的优势知多少
  13. 阿里铁军幕后推手邓康明:核心团队是剩出来的,不是选出来的
  14. python图片转文字easyocr_Python OpenCV读取png图像转成jpg图像存储
  15. 烟花代码运行示例(C++,easyX)
  16. PCIe扫盲——弹性缓存(Elastic Buffer/ CTC Buffer)
  17. 函数模板、 内联函数
  18. 使用 Learner Lab - 如何设置自己想要的VPC,以供EC2使用
  19. Tomcat Servlet 工作原理
  20. matlab A律PCM编码原理框图,求大神,讲解A律PCM编码吖

热门文章

  1. 单片机c语言中断延时,单片机中C语言延时函数
  2. oracle定时任务在哪,oracle定时任务
  3. oracle 定时任务 每天执行,Oracle定时任务(定时执行某个SQL语句)
  4. IBM Think 2019核心议题:如何打造可信人工智能
  5. 海信电视root后误删软件无法进入主页键解决办法
  6. SAP MTS/ATO/MTO/ETO专题之一:常用计划策略(需求类)
  7. Unity接入Steam成就
  8. CentOs7下Zabbix安装教程——zabbix server安装
  9. 用计算机运算符编写检索式,检索式
  10. python中的chardet模块