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

1.数据争用(data race)

定义:①多个线程对于同一个变量、②同时地、③进行读/写操作的现象并且④至少有一个线程进行写操作。(也就是说,如果所有线程都是只进行读操作,那么将不构成数据争用)
后果:如果发生了数据争用,读取该变量时得到的值将变得不可知,使得该多线程程序的运行结果将完全不可预测,可能直接崩溃。
如何防止:对于有可能被多个线程同时访问的变量使用排他访问控制,具体方法包括使用mutex(互斥量)和monitor(监视器),或者使用atomic变量。

2.竞态条件(race condition)

当编写多线程程序时,常出现的一个错误便是Race Condition, 即竞争危害/竞态条件。当两个或更多线程都能同时获取以及改变共享数据时,竞争危害便发生了。因为各个线程对数据操纵的顺序并不可预知,因此数据改变的结果取决于线程最终的运行顺序。所有的线程都在“Racing”(竞争)以优先获取数据改变数据。

  最常见的竞争危害的情形是一个线程执行条件语句,“检测条件是否满足——执行”,例如:

if (x == 5)    // 检测
{
   y = x * 2;  // 执行
 
   // 如果其他的线程在"if (x == 5)" 和 "y = x * 2" 之间改变了x的值,
   // 那么y最终不会等于10.
}
  所以y最终可能等于10也可能等于其余任意值,完全取决于x是否在检测和执行之间被改变,而此改变的发生与否是未知的。

  为避免竞争危害,通常采取的措施是给共享数据加锁来保证每次只能有一个线程来获取操纵数据。具体如下:

// 为x加锁
if (x == 5)
{
   y = x * 2; // 现在x不再能被改变,直到解锁。
              // 因此y = 10
}
// 解锁x
  当其他线程想要获取x,便需要等待x被解锁。如果x一直未被解锁,那其他线程也将一直等待下去。。。
  有关加锁的更多知识,请搜索mutex, semaphore, critical section, shared resource
---------------------

参考:https://blog.csdn.net/he_wolf/article/details/15808441

https://blog.csdn.net/gg_18826075157/article/details/72582939

数据争用(data race) 和竞态条件(race condition)相关推荐

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

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

  2. python 很高兴问题_Python 3.7曾有一个很老的GIL竞态条件(race condition),我是这么解决的...

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 作者:Victor Stinner 作为Python最关键的组成部分之一:GIL(全局解释器锁),我花了4 ...

  3. eclipse运行go test_在 Go 中发现竞态条件 (Race Conditions)

    当我意识到我一直在处理和解决的问题有一个专有名词描述的时候,我总会觉得这事十分有趣.这次出现这种情况的是竞争条件(Race Conditions).当你处理多个 routine 共享某类资源的时候,不 ...

  4. 竞态条件(race condition)

    在学习多线程的过程中,因为是非科班学生,操作系统的东西都是一知半解的,所以很多名词都没有理解,另外具体的Java虚拟机如何工作还需要后续的学习,这里只能慢慢学习了,等到这本书看完好好读读操作系统的东西 ...

  5. golang data race 竞态条件

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

  6. 竞态条件的赋值_信号-sunshine225-51CTO博客

    一.基础知识信号产生的条件 a. 终端按键产生.如:ctrl+c(SIGINT信号),ctrl+\(SIGQUIT信号),ctrl+z(SIGTSTP信号)...... b. 系统命令和函数.如:ki ...

  7. 谈谈对“竞态条件”和“数据竞争”的理解

    在<JAVA并发编程实战>中提到两个术语:"竞态条件"和"数据竞争". 当时确实没看懂这两个东西有啥区别,我觉得最大的问题在于作者用鸡蛋去解释鸡蛋的 ...

  8. 计算机系统学习之(1):基础知识概要——进程、中断、线程、竞态条件、关键区域、死锁、进程调度

    文章目录 进程的创建 哪些事件导致进程的创建 fork 和 exec 命令创建和控制进程 fork() 命令 execve() 命令 进程的状态 中断 中断的种类 线程 线程共享内容 线程独有内容 进 ...

  9. 竞态条件的赋值_《Java并发编程实战》读书笔记一:基础知识

    一.线程安全性 一个对象是否是需要是线性安全的,取决于它是否需要被多个线程访问 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要额外的同步,这个 ...

最新文章

  1. dac0832控制电机驱动流程图_智能电机驱动器让你的机器人控制更简单
  2. 【IOS】ios之httpServer
  3. 评价算法的性能从利用计算机资源角度,计算机专业数据结构课后练习题汇编
  4. 简单区分Vmware的三种网络连接模式(bridged、NAT、host-only)
  5. 经典面试题(28):以下代码将输出的结果是什么?
  6. PowerDesigner 16.5下载安装包
  7. 按发动机排量征收汽车消费税是不合理的,应该按燃烧室容积征税
  8. 局域网服务器配置一个无线路由,局域网怎么增加无线路由器
  9. 读懂复利“魔力” 30年让你成为千万富翁
  10. (三)elasticsearch学习笔记————文档基本操作
  11. python循环次数教程_Python基础教程-循环
  12. [ZT]毁人不倦的应试教育(2)
  13. 配置Json-Server
  14. 设计和构建区块链社交媒体平台
  15. 干货,分享kali安装arpspoof,以及常见错误问题,结尾附上局域网arp断网攻击
  16. 电子商务网站一般架构有哪些
  17. 接口测试 | 接口测试入门
  18. window 10如何创建虚拟桌面
  19. 计算机监测可以装win10,怎么检测自己的电脑能否匹配Win10系统
  20. 微软大佬带你深入解析websocket丨tcp自定义协议的设计丨服务器高并发场景的优化

热门文章

  1. 周长为定长的所有平面四边形P中,面积最大的为正方形。
  2. 环境变量的作用,为什么要设置环境变量
  3. 【前端】html+css实现鼠标悬浮变色的按钮,消除加粗边框发生抖动现象的两种方法 hover【HTML+CSS+JavaScript(JS)】
  4. 都知道vue3响应式是Proxy实现的,进来把proxy与Reflect吃透
  5. 论文《Avoiding Inference Heuristics in Few-shot Prompt-based Finetuning》学习笔记
  6. 在二叉树中找到两个节点的最近公共祖先(C++)
  7. CPU基本结构和运行原理
  8. 【個人用】飲み会店情報
  9. delta机器人 寸拳_《这就是寸劲?》第四章
  10. 智工运维定位器之ublox