再论int变量赋值的原子性
来源:互联网 发布:淘宝怎么入驻企业店铺 编辑:程序博客网 时间:2024/05/22 10:42
原文链接:再论int变量赋值的原子性<p>http://bbs.chinaunix.net/thread-1805189-1-1.html</p>
#include <stdio.h>#include <unistd.h>#include <pthread.h>struct STRU{ char a; int b;}__attribute__((packed));struct STRU v; void threadfun1(void){ int i = 0; while(1) { if(i%2 == 0) { v.b = 0x55555555; } else { v.b = 0xaaaaaaaa; } i++; } } void threadfun2(void){ int i; while(1) { i = v.b; if((i != 0x55555555) && (i != 0xaaaaaaaa)) { printf("v.b = %x\n", i); } }} void main(void){ pthread_t tidFun1; pthread_t tidFun2; pthread_create(&tidFun1, NULL, threadfun1, NULL); pthread_create(&tidFun2, NULL, threadfun2, NULL); while(1) { sleep(5); }}
可以看到,对变量v.b的一个int赋值被分成了多条汇编语句,在目标机上运行,打印结果为以下多种结果
v.b = 55aaaaaa
v.b = 555555aa
v.b = aa555555
v.b = aaaa5555
......
由此可见,至少在arm9的CPU上,在非内存对齐的情况下,存在一个线程对全局的int变量赋值没有完成而被另一个线程读走,从而导致未知后果的可能性。
如果是在X86上又会如何?
以下是在X86上的汇编代码:
由上看到,X86对这种字节对齐的int变量也是只用了一条movl语句进行赋值,所以不会存在赋值到一半被另一个线程读走的情况,通过运行实验程序也证明了这个问题。
最后,虽然题目是“再论int变量赋值的原子性”,但如果其内容能达到前一帖子的百分之一二有用,我就心满意足了
0 0
- 再论int变量赋值的原子性
- int 变量直接赋值,是原子操作吗?
- 关于int全区变量读写的原子性
- 原子变量的操作
- 用户态的原子变量
- java原子变量的理解
- volatile 不能保证变量的原子性的操作
- 将一个负的short类型的变量赋值给一个int类型的变量,之后int类型的变量的值仍是负数
- java多线程之共享变量的可见性、原子性
- long和double类型变量的非原子性
- 多线程:保持原子性的变量AtomicInteger(效率高于synchronized)
- C语言中判断int,long型等变量是否赋值的方法
- C#变量的赋值
- shell 变量的赋值
- 变量的引用赋值
- public变量的赋值
- 变量的解构赋值
- 变量的解构赋值
- JSTORM使用笔记
- AndroidUI基础之 TimePickerDialog与 Timpicker 等简单的使用
- 环形缓冲区的设计与实现
- ListView详解
- 【SQL 编程你也行】SQL Server 2014新功能之序列Sequence
- 再论int变量赋值的原子性
- 摄像头采集,264编码,live555直播(1)
- 多线程之NSThread
- 编译属于自己的openwrt固件
- Android Fragment生命周期和参数传递
- cloudera安装报错 socket.gaierror: [Errno -2] Name or service not known
- 从源码分析 Android dexClassLoader 加载机制原理
- Android:开发规范
- 209,自定义代理例子与数据加载结合