添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
纯真的冲锋衣  ·  数据争用(data race) ...·  9 小时前    · 
大方的沙发  ·  onBeforeRouteLeave ...·  5 月前    · 
长情的自行车  ·  FreeMarker Manual - ...·  1 年前    · 
坚强的咖啡豆  ·  定位L4级 ...·  1 年前    · 

在有关多线程编程的话题中,数据争用(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 ? data race 发生的充分 条件 1.两个或者更多线程在一个程序中,并发的访问同一 数据 ;2.至少一个访问是写操作;3.这些线程都不使用任何互斥锁来控制这些访问。#当上面这些 条件 发生时,访问的顺序是不确定的,并且基于这些不同的运行顺序会导致计算产生不同的结果(这些结果也是正确的)。一些 data race 是良性的,但是更多的是会产生程序 的bug。 https://docs
数据 data race )是指在非线程安全的情况下,多线程对同一个地址空间进行写操作。一般来说,我们都会通过线程同步方法来保证 数据 的安全,比如采用互斥量或者读写锁。但是由于某些笔误或者设计的缺陷,还是存在 data race 的可能性的。(转载请指明出于breaksoftware的csdn博客) 比如下面这段代码 #define _GNU_SOURCE 1
条件 race condition )是一个在设备或者系统试图同时执行两个操作的时候出现的不希望的状况,但是由于设备 系统的自然特性,为了正确地执行,操作必须按照合适顺序进行。     在计算机内存或者存储里,如果同时发出读写大量 数据 的指令的时候 条件 可能发生,机器试图覆盖相同的或者就的 数据 ,而此时旧的 数据 仍然在被读取。结果可能是下面一个或者多个情况:计算机死机,出现非法操作提示并结束程
golang中的 go 关键字可以很方便的开启一个协程, 在函数中又非常容易隐藏 go这个关键字; 所以当程序庞大时, 有时会不知道一个变量被几个协程所引用, 是否会引起多个协程 。 golang在1.1之后引入了 检测机制, 可以使用 go run - race 或者 go build - race 来进行静 检测。 其在内部的实现大概就是: 开启多个协程执行同一个命令, 并且记录下每个变量...
一、名词解析 1、 data race : Any race is a bug 定义: ①多个线程 ( 协程 ) 对于同一个变量、②同时地、③进行读/写操作、并且④至少有一个线程进行写操作。(也就是说,如果所有线程都是只进行读操作,那么将不构成 数据 用) 后果: 如果发生了 数据 用,读取该变量时得到的值将变得不可知 ( 根据内存模型 ) ,使得该多线程程序的运行结果将完全不可预测,有一定可能会导致直接崩溃。 如何防止: 对于有可能被多个线程同时访问的变量使用排他访问控制,具体方法包括使用
对于搞 数据 检测方向的人来说,Lockset方法大家肯定不陌生,作为一个刚入门 数据 检测方向的我来说,就 大家总结一下我近期有关Lockset方法的一些研究 心得。       Lockset方法研究比较早可以追溯到1997年Eraser那篇论文,被引用无数次,非常经典的方法。       Reference       Savage S, Burrows M, Nelson G, et
目录Go 并发 | 数据 条件 数据 ( data race ) 避免 数据 的发生 条件 ( race condition ) 总结参考 Go 并发 | 数据 条件 Go 并发中有两个重要的概念: 数据 ( data race ) 条件 ( race condition ) 在并发程序中, 问题可能是程序面临的最难也是最不容易发现的错误之一 数据 ( data race ) 当两个或多个协程同时访问同一个内存地址,并且至少有一个是在写时,就会发生 数据 ,看一下以下例子 i := 0 go fu