C#.多线程 (三) 代码测试中,并发Bug与偶发Bug的区别:多线程下变量的可见性、原子性、有序性

目录

一、简介

二、并发Bug

2.1、可见性

2.2、原子性

2.3、有序性

三、偶发Bug


一、简介

   经常听见别人讨论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一般都是严重的,偶发发生,但却是致命的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我爱AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值