多线程:线程冲突操作与数据竞争

Multithreading: Conflicting operations by threads vs data race

线程冲突和数据竞争有区别吗

据我所知,当两个线程试图访问同一内存位置并且至少其中一个是写操作时,就会发生冲突操作。

Here 是维基百科关于数据竞争/竞争条件的说法。

它们有什么不同?

我终于找到了这个问题的好答案。

TL:DR:-

冲突操作 -

  • 涉及多线程
  • 正在访问相同的内存位置
  • 其中至少有一个是写操作。

数据竞争 - 无序 冲突操作。

长版 -

我正在举例说明冲突操作是如何发生的,以及如何确定它们是否没有数据竞争。

考虑 Thread 1Thread 2,以及共享变量 done

AtomicBoolean done = new AtomicBoolean(false);
int x = 0;

Thread 1

x = f();
done.set(true);

Thread 2
while(!done.get()) 
    {
    /* a block */
    }
y = g(x);

这里done.set() - done.get()x=f() - y=g(x)有冲突。然而,编程内存模型定义了 2 个关系:- synchronizes-withhappens-before。因为 done 是原子的,所以它的一对操作彼此同步。此外,正因为如此,我们可以选择哪个操作 happens before 那对中的另一个。

现在因为 x = f() 在线程 1 中发生在 done.set(true) 之前,而 done.get() 在线程 2 中发生在 y = g(x) 之前,我们可以说 x = f()y = g(x) 因为 happens before 是一个传递关系。

因此,上面的示例是有序的,因此没有数据争用。