先说明一下 a=a+1这条程序语句的执行步骤:
javascript:;
我在想这种情况:
如果执行到第一步,将a的值读到寄存器R中
执行完这一条后,来了个中断就是 a=a-1 !
等执行完 a=a-1 ,这时候重点来了!
我的CPU会回到 a=a+1 的第二步!
R寄存器里面是不知道 a 已经被改变了,所以他还是按照原先的值 加1!
然后在写回到 a !
这时候就会出现bug了!
这种情况大伙们有考虑过吗? 要怎么避免?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
兄台这个大多数是正确的,但是这个话不可以说
这么满。
首先这个假定是只有一个消费者。如果有多个
消费者线程那结果就不对了。
第二,假定这个是只有一个producer,如果有
两个 producer 线程或者有多级中断都有可能
写入,这个代码也就不对,和 LZ 提到的问题
本质一样。
第三,就算只有一个producer 只有一个消费者。
这个代码仍然有可能不对,因为 wr 有可能会溢出。
如果write 一次写太多,wr 是个 8 位的 int, 那么
累计写超过 256 没有去 read 那结果也是不对的。
如果 wr 是 32 位会相对难溢出一点,但是这个情况
也要有考虑。这个是可以在代码里面有体现的。
我就留给有心的程序员来补全了。
一周热门 更多>