在中断程序内 变量的加加,这种情况是否会出现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条回答
helislayer
1楼-- · 2020-01-06 12:06
redroof 发表于 2016-12-8 09:04
我贴一个完整的无锁队列来终结讨论吧。
这是真正完整的代码。模板参数buflen是队列缓存的长度,T是队列里 ...

这个首先是不太应该用 C++ template,特别是在中断里面。
C++ class 里面很容易有隐含的 malloc,在中断里面容易出很隐晦的问题。
其他那个 % 是完全不必要的,可以用 ? : 来代替。
另外 aa 是个很糟糕的名字。
其他的问题还没有仔细看。
tangnyzl
2楼-- · 2020-01-06 15:47
用个函数,加个锁才搞,不然肯定要出问题
jaky80000
3楼-- · 2020-01-06 16:32
留个记号,学习一下
int
4楼-- · 2020-01-06 18:55
 精彩回答 2  元偷偷看……
redroof
5楼-- · 2020-01-06 20:14
helislayer 发表于 2016-12-8 22:12
这个首先是不太应该用 C++ template,特别是在中断里面。
C++ class 里面很容易有隐含的 malloc,在中断 ...

请明示哪里有隐含malloc?
我用这个代码好多年了,从没发现需要动态内存分配…
redroof
6楼-- · 2020-01-06 23:41
helislayer 发表于 2016-12-8 22:12
这个首先是不太应该用 C++ template,特别是在中断里面。
C++ class 里面很容易有隐含的 malloc,在中断 ...

如果你非要在这个队列里装那种内部自带有动态分配内存的对像,那也不算是我的这个代码在分配内存,对吧!要注意的是你装进去的对像自身的代码。
只要正确使用,这个队列是完全安全的,不用怀疑。
C++的模板从来不会隐含什么,跟你手工对每种特定类型各写一份代码一样高效。

一周热门 更多>