Data-Race-Free

Data-Race-Free

无数据竞争Data-Race-Free是指程序中不存在Data-Race,简称DRF。

DRF的意义在于,如果一个编写的程序是满足DRF要求的,那么该程序在弱一致性模型上执行的结果和在SC模型下执行的结果是一样的。因此程序员既可以用SC模型(最直观简单)推断自己的程序正确性,也可以享受到弱一致性模型的优化性能。

下面对Data-Race进行非正式和正式的描述:

非正式地描述

Data-Race发生在当两个线程访问相同的内存位置,至少有一次访问是写,并且没有中间的同步操作时。

正式描述:

  • 将内存中的操作分为同步操作(synchronization Operations)和数据操作(data Operations)。同步操作包括锁的获取和释放。

  • 我们说两个数据操作Di和Dj是冲突(conflict)的,当二者来自不同的处理器或线程,并且访问了同一个地址,且至少一个操作时存储操作。

  • 我们说两个同步操作Si和Sj是冲突的,当二者来自不同的处理器或线程,并且访问了同一个地址,且同步操作的类型是冲突的(例如锁的获取和释放就是一对冲突)

  • 我们说两个同步操作Si和Sj是过渡性冲突(transitively conflict)的,要么是Si和Sj冲突;要么是Si和Sk冲突,在Sk的程序顺序之后的Sk‘(即Sk <p Sk')和Sj过渡性冲突。

  • 我们说两个数据操作Di和Dj是数据竞争(Data-Race)的,当他们是冲突的,并且在他们的内存顺序位置之间不存在来自处理器(或线程)i、j的一对过渡性冲突同步操作。换句话说,Di和Dj之间不存在数据竞争的充要条件是存在一对过渡性冲突的同步操作对Si和Sj在他们的内存顺序之间(比如Di <m Si <m < Sj <m Dj)

  • 如果一个SC的执行中不存在数据竞争,那么这个SC执行是DRF的。

  • 如果一个程序的所有SC执行都不存在数据竞争,那么这个程序是DRF的。

一个没有数据竞争的例子

事实上,F11、F14、F21、F24是不必要的。只有F12、F13、F22、F23是必要的。

推断程序中是否存在数据竞争是非常困难的。只要不确定是否需要FENCE,就可以通过添加FENCE来避免不确定性。这总是正确的,但可能会损害性能。极端情况下,可以用FENCE包围所有的内存操作,以保证任何程序符合SC行为。

猜你喜欢

转载自www.cnblogs.com/chenzhongjie/p/13375040.html