一个i++的教训,多线程问题

原创 2015年11月19日 22:39:30

设计了一个ring buffer,一个中断进程负责往里面写入数据,一个后台进程负责读取数据。

数据每次写入就对cnt++,每次读取就cnt--,运行一段时间之后,发现写指针和读指针对不上了,中间隔开了一段距离。

查了很久,发现很有可能是这个cnt++出了问题,因为++操作不是原子操作,需要先mov出来,++,然后写回,这样的话有可能在中断里++之后又被原先被中断的--操作覆盖。

详细的过程分析:

1. CPU执行到cnt--,

2. cnt的值(架设==5)被mov到寄存器进行--操作

3. 寄存器完成操作得到结果4

4. 把寄存器的结果写回变量的内存地址,最终得到4.

假如在第2步之后发生了中断,那么情况是:

1. CPU执行到cnt--,

2. cnt的值(架设==5)被mov到寄存器进行--操作

3. 发生中断,中断程序把临时变量入栈,保护现场,也就是把寄存器里cnt=5保存起来

4. 中断里面获取cnt的值,也是5,放入寄存器进行++运算

5. 把运算结果6写回变量的内存地址,此时内存里的值为6

6. 中断程序退出之前恢复现场,把之前的变量出栈,寄存器恢复为5并进行--运算

7. 寄存器完成操作得到结果4

8. 把寄存器的结果写回变量的内存地址,最终得到4.

这样,最终的结果就好比根本没用执行cnt++,实际上只执行了cnt--。


解决的办法:

暂时我想到的是,在需要做cnt--之前先关闭中断,等完成后重新打开中断。





版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Java多线程之i++的安全性问题

问题: 两个线程同时对i=0的数据分别进行i++一百次,结果出来并不是200。理论上来讲,结果最小值为2,最大值为200。 首先解释一下为什么会这样。 i++并非原子操作。执行过程中JVM从内存...

i++的线程安全性

该文章原创,转摘http://blog.csdn.net/sapair/archive/2009/06/05/4243974.aspx   i++的线程安全性可以总结如下: (1)如...

面试---i++在两个线程分别执行100次,最大值和最小值分别多少

i++只需要执行一条指令,并不能保证多个线程i++,操作同一个i,可以得到正确的结果。因为还有寄存器的因素,多个cpu对应多个寄存器。每次要先把i从内存复制到寄存器,然后++,然后再把i复制到内存中,...

当自增/减(++/--)遇上多线程

本文主要讲述,在刚接触多线程编程时,将自增变量作为参数传进线程函数时,发生的“奇异”现象。 事情是这样的:生成1000W随机数,创建N个线程,将这些随机数随机的写到这N个文件中,每个随机数在一个文件...

从volatile说到,i++原子操作,线程安全问题

1、可见性(Visibility)         可见性是指,当一个线程修改了某一个全局共享变量的数值,其他线程是否能够知道这个修改。         显然,在串行程序来说可见性的问题是不存在的。因...

句柄泄露与CloseHandle()

摘自:http://blog.chinaunix.net/uid-21783276-id-2689047.html CloseHandle()函数的使用?? 很多程序在创建线程都这样写的:...

Windows核心编程:内核对象

作者:shenzi链接:http://hi.csdn.net/shenziWindows核心编程:内核对象 1.对象和句柄    对象是静态定义的对象类型的单个运行时实例。对象类型包括系统定义的数...
  • shenzi
  • shenzi
  • 2009-09-19 20:36
  • 3602

C++中CloseHandle()函数的使用

转自:http://blog.csdn.net/lhsxsh/article/details/3905505 很多程序在创建线程都这样写的: ThreadHandle = CreateTh...

CloseHandle()函数的使用

CloseHandle()函数的使用??很多程序在创建线程都这样写的:............ThreadHandle = CreateThread(NULL,0,.....);CloseHandel...
  • lhsxsh
  • lhsxsh
  • 2009-02-18 13:59
  • 17238

秒杀多线程第十一篇 读者写者问题

与上一篇《秒杀多线程第十篇 生产者消费者问题》的生产者消费者问题一样,读者写者也是一个非常著名的同步问题。读者写者问题描述非常简单,有一个写者很多读者,多个读者可以同时读文件,但写者在写文件时不允许有...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)