三类均是跟共享变量的内存访问有关的缺陷。
对于并发缺陷的分类目前国内许多是分死锁、数据竞争、原子违背、顺序违背。
或者在并发缺陷中又细分 concurrency vulnerability :死锁和数据竞争。
感觉各个作者有自己的分类方法?

以下引用的中文解释来自<并发缺陷暴露、检测与规避研究综述>哈工大的苏小红老师实验室发表在2015年计算机学报上

目前找到外文文献分为7类。其他四类是我上篇说的死锁(Deadlock)、活锁(LiveLock)、饥饿(Starvation)、挂起(Suspension)

data race数据竞争

race condition竞用条件:

  1. 并发线程在同一个内存地址上操作
  2. 其中至少一个是写操作
  3. 内存没有使用同步机制

注意:满足竞用条件时,不一定产生数据竞争。
Data race occurs when at least two threads access the same memory location , with at least one of them writing data to that location and these accesses are not protected by locks
谷歌翻译: 当至少两个线程访问同一内存位置时发生数据争用,其中至少一个线程将数据写入该位置,并且这些访问不受锁的保护
中文解释: 对某一共享内存单元,存在来自不同线程的两个并发访问,且至少一个为写访问.并发意指这两个访问之间没有happens-before关系,存在“同时”发生的可能.

happens-before:
Chapter 17 of the Java Language Specification defines the happens-before relation on memory operations such as reads and writes of shared variables. The results of a write by one thread are guaranteed to be visible to a read by another thread only if the write operation happens-before the read operation. The synchronized and volatile constructs, as well as the Thread.start() and Thread.join() methods, can form happens-before relationships.

atomicity violation原子违背

Atomicity violation occurs when the execution of two code blocks(sequences of statements protected by locks) in one thread is concurrency overlapping with the execution of one or more code blocks of other threads ,in such a way that the resulting content of memory cannot be achieved by executing the involved blocks in any non-overlapping order.
谷歌翻译: 当一个线程中的两个代码块(受锁保护的语句序列)的执行与其他线程的一个或多个代码块的执行并发重叠时,就会发生原子性冲突,以这样一种方式,使得不能通过以任何非重叠的顺序执行代码块来实现所得到的存储器内容。
中文解释: 对某一为保证正确性必须原子性执行的指令序列,存在一个执行交错,其执行效果不与任何该指令序列原子性执行时的执行交错的效果相同.

单变量的四种原子性违背的例子

T1两次读值不一致;T2写的值被覆盖; T1读值不一致 ; T2读到了中间值


解释:正确顺序L1-L2-L3 判断缓冲区剩余是否够,不够就加,之后写入。错误顺序L1-L3-L2使得缓冲区还未扩容便填充,造成缓冲区溢出。

解释:指针指向proc_info后,再写入数据,S3造成空指针异常NPD

order violation顺序违背

Order violation occurs when the expected order of at least two memory accesses is not respected, i.e., the programmer’s intended order of execution is not enforced. 两个存储访问的顺序违反
谷歌翻译: 如果不遵守至少两次内存访问的预期顺序,即不执行程序员的预期执行顺序,则会发生顺序冲突。
中文解释: 顺序违背.某一指令(组)没有按照预期,总是在另一指令(组)之前或者之后执行.
消除顺序违背的措施一般是使用条件变量在指令(组)之间形成固定的执行次序.

解释:thread1初始化io_pending S4必须在S2之后执行

解释:需要先初始化在操作,造成Use before init缺陷

三者区别

data race order violation atomicity violation
至少一个线程在等待状态
至少一个线程执行状态
所有线程都在执行态
产生错误、或非预期结果
至少一个线程持有锁
不同的线程访共享内存
至少一个内存访问操作是写
内存访问没有同步机制保护
在内存访问中,至少有一个正确的执行顺序没有被保证
序列需要被原子执行

【并发缺陷】data race数据竞争、atomicity violation原子违背、order violation顺序违背相关推荐

  1. Go并发编程里的数据竞争以及解决之道

    Go语言以容易进行并发编程而闻名,但是如果稍不注意,并发程序可能导致的数据竞争问题(data race)就会经常出现在你编写的并发程序的待解决Bug列表中-- 如果你不幸在代码中遇到这种错误,这将是最 ...

  2. Go 并发 | 数据竞争及竞争条件

    目录 Go 并发 | 数据竞争及竞争条件 数据竞争 (data race) 避免数据竞争的发生 竞争条件 (race condition) 总结 参考 Go 并发 | 数据竞争及竞争条件 Go 并发中 ...

  3. 并发编程的数据竞争问题以及解决之道

    Go语言以容易进行并发编程而闻名,但是如果稍不注意,并发程序可能导致的数据竞争问题(data race)就会经常出现在你编写的并发程序的待解决Bug列表中-- 如果你不幸在代码中遇到这种错误,这将是最 ...

  4. go 并发编程 之 数据竞争 data race (三)

    前言 两个或多个 goroutine 访问同一个资源(如变量或数据结构),并尝试对该资源进行读写而不考虑其他 goroutine.这种类型的代码可以创建你见过的最疯狂和最随机的 bug.通常需要大量的 ...

  5. 数据竞争(data race)问题分析的利器——valgrind的Helgrind

    数据竞争(data race)是指在非线程安全的情况下,多线程对同一个地址空间进行写操作.一般来说,我们都会通过线程同步方法来保证数据的安全,比如采用互斥量或者读写锁.但是由于某些笔误或者设计的缺陷, ...

  6. 数据争用(data race) 和竞态条件(race condition)

    在有关多线程编程的话题中,数据争用(data race) 和竞态条件(race condition)是两个经常被提及的名词,它们两个有着相似的名字,也是我们在并行编程中极力避免出现的.但在处理实际问题 ...

  7. 别混淆数据争用(data race) 和竞态条件(race condition)

    在有关多线程编程的话题中,数据争用(data race) 和竞态条件(race condition)是两个经常被提及的名词,它们两个有着相似的名字,也是我们在并行编程中极力避免出现的.但在处理实际问题 ...

  8. golang的 data race 分析

    golang的data race 一.名词解析 1.data race: Any race is a bug 定义: ①多个线程(协程)对于同一个变量.②同时地.③进行读/写操作.并且④至少有一个线程 ...

  9. golang data race 竞态条件

    golang race condition 竞态条件 data race race condition golang race detector golang的协程机制使得编写并发代码变得非常容易,但 ...

最新文章

  1. 微软MCITP系列课程
  2. mysql临时表是什么意思_来谈谈MySQL的临时表,到底是个什么东西,以及怎么样产生的...
  3. Protobuf在Unity中的通讯使用
  4. 为什么晚结婚的离婚率低?与这个对于我们的启示。
  5. oracle修改10到20,Oracle 10.2.0.5 RMAN迁移并升级11.2.0.4一例
  6. c++一个类创建多个对象_C ++ | 创建一个类的多个对象
  7. group_concat 排序并取前三个
  8. asp.net mvc 之旅—— 第一站 从简单的razor入手
  9. java电子书chm全套下载
  10. 滴滴天使投资人的25条创业建议
  11. 微博宕机复盘:什么样的技术架构,可支持80个明星并发出轨?
  12. pandas parquet文件读取pyarrow、feather文件保存与读取;requests 或wget下载图片文件
  13. 怎么往日历里面加时钟java,怎样在博客里添加钟表和日历
  14. 动态规划——爬楼梯问题(爬楼梯+最省力爬楼梯)
  15. 神奇的递归!一文读懂函数递归(python实现)
  16. 目标检测之one-stage和two-stage网络的区别
  17. 图书馆共享计算机,图书馆资源共享中计算机网络技术的使用
  18. Blob 文件下载 ,使用file-saver,判断数据是否为blob
  19. 策划经验分享——常用软件篇
  20. 汉字和阿拉伯数字的相互转换

热门文章

  1. DM共享存储集群搭建
  2. 网络爬虫可以做什么?
  3. 人形机器人促进人工智能技术发展
  4. isdigit函数详解
  5. Charles IOS抓包
  6. Chanel收购200多年历史的西班牙皮革制造商 Colomer
  7. Proteus 仿真时出现 No model specified for J1、2、3 debug
  8. 第七届蓝桥杯 java组有奖竞猜
  9. 什么是Web应用程序?
  10. 磁致式量水堰计怎么安装?应用方向有哪些?