在中断程序内 变量的加加,这种情况是否会出现BUG!

2019-12-27 19:02发布

先说明一下   a=a+1这条程序语句的执行步骤:
javascript:;

我在想这种情况:
如果执行到第一步,将a的值读到寄存器R中

执行完这一条后,来了个中断就是 a=a-1 !
等执行完 a=a-1 ,这时候重点来了!

我的CPU会回到 a=a+1 的第二步!
R寄存器里面是不知道 a 已经被改变了,所以他还是按照原先的值 加1!
然后在写回到 a !
  
这时候就会出现bug了!
这种情况大伙们有考虑过吗?  要怎么避免?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
84条回答
Scarlette
1楼-- · 2020-01-02 10:27
helislayer 发表于 2016-12-4 09:33
不是脏数据,是防止数据变脏的问题。如果已经变脏了,
那损失就已经造成了。数据库的脏数据是比较大型的 ...

终于见到个思维非常清醒的人了,不容易啊,兄弟
当年我组里一个小屁孩就是,觉得加了个volatile编译器就会搞定一切。教育了好几次,仍然死不肯用自旋锁,理由是测试运行中没看到出错。最后组里所有人都忍无可忍了,只能请他滚蛋
McuPlayer
2楼-- · 2020-01-02 13:21
这是典型的临界区问题,某一时刻只能一个访问者,甚至不允许一个读和一个写同时进行、
解决问题的原则就是原子操作,最简单的实现方式就是关中断,但他有额外性能损失
所以很多32位的cpu提供一些硬件上的辅助机制来实现
188089942
3楼-- · 2020-01-02 14:37
saccapanna 发表于 2016-12-3 07:31
中断用到的寄存器入栈,与楼主的问题没关系。楼主说的是全局变量在前后台都被访问,如果前台访问不是原子 ...

是的 好多坛友不把问题点搞混了  什么会入栈 和 volatile 都没用
188089942
4楼-- · 2020-01-02 19:23
 精彩回答 2  元偷偷看……
188089942
5楼-- · 2020-01-03 01:16
Scarlette 发表于 2016-12-4 14:13
终于见到个思维非常清醒的人了,不容易啊,兄弟
当年我组里一个小屁孩就是,觉得加了个volati ...

死不肯改是因为他学的不够精,不理解为什么会有这样的bug(甚至他自己觉得根本就没这个bug),  加上小屁孩的性格倔!

像这样的问题,很多人不肯去钻,不肯花时间去学,以为能写代码能跑起来就可以了。
譬如这个问题,不理解这个CPU++操作是怎么个回事,当然不清楚问题点在哪里,所以这个小屁孩根本就理解不了这个问题!
zengyi
6楼-- · 2020-01-03 02:18
如果这个a是标志量的话,一定需要互斥来实现原子操作。

一周热门 更多>