今天在思考一个问题:
两个线程访问一个变量A(初始化值是0),一个线程写(准备写的值是0xFF),一个线程读。
在没有锁的情况下,读的线程有没有可能读到的值是0x0F或0xF0。
为什么有这么一个疑问,
因为看到很多代码都是假设这个情况是不可能发生的。
最后在
http://stackoverflow.com/questions/54188/are-c-reads-and-writes-of-an-int-atomic
以及其他地方找到答案。
简单说来跟CPU的数据总线宽度有关,也跟cpu的cache策略有关,
但只要是地址关于总线宽度是对齐的,就能保证上诉的状况不会发生,至少现在x86体系的cpu是这样的。
不过现代的CPU的都能保证这点,不然就弱爆了,谁敢用啊~
也就是保证一个线程不可能看到一个简单类型只写了一半。
intel的开发者文档说明了这一点。
http://www.intel.com/Assets/PDF/manual/253668.pdf
8.1.1 Guaranteed Atomic Operations
The Intel486 processor (and newer processors since) guarantees that the following basic memory operations will always be carried out atomically:
Reading or writing a byte
Reading or writing a word aligned on a 16-bit boundary
Reading or writing a doubleword aligned on a 32-bit boundary
The Pentium processor (and newer processors since) guarantees that the following additional memory operations will always be carried out atomically:
Reading or writing a quadword aligned on a 64-bit boundary
16-bit accesses to uncached memory locations that fit within a 32-bit data bus
The P6 family processors (and newer processors since) guarantee that the following additional memory operation will always be carried out atomically:
Unaligned 16-, 32-, and 64-bit accesses to cached memory that fit within a cache line
现在很多服务器的cpu都是64位的。而且cache line一般也有64Byte。
在比较新款的CPU下,程序员就算没有注意到这个问题,产生BUG的几率也是非常低的。
但它是个BUG!!!
既然有了这个特性,多线程程序又有不少优化点了吧?!
相关推荐
分布式Redis原子操作示例,近期项目中遇到分布式项目中多节点大并发操作redis同一个key。此案例利用java调用LUA脚本实现redis操作的原子性。分享出来大家参考。
串口方式:用串口接收中断方式接收,不是DMA. 遇到的问题:串口数据有帧丢失。 原因描述:在串口接收中断中接收到字节时变量size...实际的原因是对size的操作不是原子操作的,具体更改见文档。有相关程序和具体的分析。
多线程程序中的原子操作
在kotlin中使用原子操作的惯用方法。
1.认识原子操作 原子操作就是在多线程程序中“最小的且不可并行化的”操作,意味着多个线程访问同一个资源时,有且仅有一个线程能对资源进行操作。通常情况下原子操作可以通过互斥的访问方式来保证,例如Linux下的...
C++多线程原子操作实现方法。很很详解!
测试了windows下原子操作api的使用,很简单的测试,还是比较有趣的
近代物理实验,氢原子光谱数据处理文档。
原子指令是特殊的硬件指令,以不可分的方式对一个或多个内存位置执行操作。无论其他处理器执行什么指令,原子操作都会成功或完全失败。 原子指令可以用来做同步处理。由于原子指令可用于更改共享数据而无需获取和...
原子操作、信号量、读写信号量和自旋锁的API.希望能帮助大家
正点原子Mini开发板 CAN总线通信实验移植CAN总线通信实验的代码。 正点原子Mini开发板 CAN总线通信实验移植。 正点原子Mini开发板 CAN总线通信实验的代码。这段代码是从战舰开发板的程序中移植过来的。硬件上需要另...
正点原子Mini开发板 CAN总线通信实验的代码。这段代码是从战舰开发板的程序中移植过来的。硬件上需要另购一个CAN收发器TJA1054或VP230的模块。RXD与TXD对接在Mini板上即可。有问题欢迎留言
NULL 博文链接:https://peter8015.iteye.com/blog/975250
锁与原子操作CAS以及无锁队列的底层实现相关资源
同步之原子操作.pptx
各位只需要将CLib4Swift.h、CLib4Swift.c以及SwiftAtomic.swift三个文件放入到自己项目工程中即可,然后还需要将"CLib4Swift.h"头文件include到你的brdige头文件中。 具体使用非常简单,直接看main.swift中的测试...
2021中国移动-5GtoB网络服务与原子能力
高准确度的时间尺度是由原子钟建立并保持的,它需要连续测量,但由于设备延迟或外界环境突变等因素,会造成数据丢失,对原子钟的测量结果分析将产生较大的影响,利用二次多项式模型能够对丢失数据进行修正,但对连续...
MongoDB原子操作与GridFS.pdf 学习资料 复习资料 教学资源