目录
一、简介
经常听见别人讨论Bug问题,那么请问什么是并发Bug与偶发Bug呢?
https://www.toobug.cn/post/876.html
- 随后把成员变量改为局部变量才解决完这个问题。所以记录一下,并发线程中任何情况下都不要使用成员变量,因为这个会使得线程变的不可控。https://www.cnblogs.com/zcydd/p/9352946.html
二、并发Bug
https://blog.csdn.net/u010523967/article/details/88125293
https://blog.csdn.net/weixin_38168947/article/details/88145891
https://www.jianshu.com/p/e662bb611360
给出了并发的源头,来自可见性、原子性、有序性。
2.1、可见性
CPU的线程A或线程B,轮流操作同一个变量V,V永远是最新的。一个线程对共享变量的修改,另一个线程能够立刻看到,这就是可见性。https://blog.csdn.net/weixin_38168947/article/details/88145891
省略,具体请参考以上博客链接
2.2、原子性
多核CPU中,CPU-1的线程A操作变量V时,线程A突然中断。然后CPU-2的线程B,也开始操作变量V。这时候V就不是原来的V了,就不能保证原子性了。
省略,具体请参考以上博客链接
2.3、有序性
今天就犯一个这样的错误(2019-7-24)。我在Socket端,需要接受两个文件Dicom和ANN文件。然后开了两个线程,分别处理Dicom文件和ANN文件。其中,ANN处理过程,要用到Dicom处理过程中的一个变量V。
虽然我先启动了线程A处理Dicom文件,后开线程B处理Ann文件。我希望在线程A里面改变了变量V后给线程B用。
然而,其实不然,经过调试,线程A会被挂起,系统优先处理了线程B,从而导致了线程B使用没有赋值的变量V。最终产生错误。
这就是线程初始化的无序性造成的。
省略,请参考以上博客链接
三、偶发Bug
https://www.cnblogs.com/mabingxue/p/10291878.html
偶发BUG一般都是严重的,偶发发生,但却是致命的。