免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: mingjwan

对int变量的赋值是原子操作吗? [复制链接]

论坛徽章:
0
发表于 2006-08-15 11:31 |显示全部楼层
晕,还没争完?

论坛徽章:
0
发表于 2006-08-20 22:13 |显示全部楼层

不是原子操作

如果int a=0;两个线程同时执行一次a++,结果不一定是2,很有可能是1.情况可能会是这样的:
1)线程1将a的值从内存读到寄存器
2)线程1在寄存器里将a++(a=1)
3)线程2此时被调度,将a的值从内存(注意此时内存里a=0)读到寄存器
4)线程2在寄存器里a++(a=1)
5)线程1被调度,将a写回内存,a=1
6)线程2被调度,也将a写回内存,a=1

最后a=1,over!

当然这个跟平台有关,但起码intel 8086体系的cpu是这样处理的

论坛徽章:
0
发表于 2006-08-20 22:59 |显示全部楼层
原帖由 oyscal 于 2006-8-20 22:13 发表
如果int a=0;两个线程同时执行一次a++,结果不一定是2,很有可能是1.情况可能会是这样的:
1)线程1将a的值从内存读到寄存器
2)线程1在寄存器里将a++(a=1)
3)线程2此时被调度,将a的值从内存(注意此时内 ...


赋值和自加还是有区别的:赋值是一个读-写的过程,而自加是一个读-改-写的过程,比起赋值来多了一个“改”的环节。

而且你上面说的 a++ 出现的问题只会出现在多CPU结构上,对于单CPU来说应该不存在这个问题。

论坛徽章:
0
发表于 2006-08-21 08:43 |显示全部楼层
to oyscal,

global_var++被翻译成为INC GV, 和赋值不是一个语句。赋值是原子的,在SMP多CPU中也是原子的。INC在SMP中不是原子的。你说的是正确的,但忽略了关键

[ 本帖最后由 思一克 于 2006-8-21 08:44 编辑 ]

论坛徽章:
0
发表于 2013-01-04 18:57 |显示全部楼层
回复 6# coldwarm


    6L正解

论坛徽章:
4
天秤座
日期:2013-10-18 13:58:33金牛座
日期:2013-11-28 16:17:01辰龙
日期:2014-01-14 09:54:32戌狗
日期:2014-01-24 09:23:27
发表于 2013-01-05 12:41 |显示全部楼层
一看标题,再看回帖长度,估计又在讨论  a = b; 和 a = 1;

另外,专程来看…………你懂得~~~

论坛徽章:
0
发表于 2013-01-05 21:37 |显示全部楼层
指令能保证原子性,但现在一条指令也许已经由几条指令组成了,但还是能保证原子性:wink:,,,。。技术发展了。。。

论坛徽章:
0
发表于 2013-01-07 13:56 |显示全部楼层
mingjwan 发表于 2006-08-04 09:32
请问对int变量的赋值是原子操作吗?
会不会出现一个线程赋了两个字节,另一个线程来读取数据的情况呢?



要看CPU的位宽来回答。
8/16位单片机就不是原子的。
对于32位的CPU就是原子的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP