多线程:线程冲突操作与数据竞争
Multithreading: Conflicting operations by threads vs data race
线程冲突和数据竞争有区别吗
据我所知,当两个线程试图访问同一内存位置并且至少其中一个是写操作时,就会发生冲突操作。
Here 是维基百科关于数据竞争/竞争条件的说法。
它们有什么不同?
我终于找到了这个问题的好答案。
TL:DR:-
冲突操作 -
- 涉及多线程
- 正在访问相同的内存位置
- 其中至少有一个是写操作。
数据竞争 - 无序 冲突操作。
长版 -
我正在举例说明冲突操作是如何发生的,以及如何确定它们是否没有数据竞争。
考虑 Thread 1
和 Thread 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-with
和 happens-before
。因为 done
是原子的,所以它的一对操作彼此同步。此外,正因为如此,我们可以选择哪个操作 happens before
那对中的另一个。
现在因为 x = f()
在线程 1 中发生在 done.set(true)
之前,而 done.get()
在线程 2 中发生在 y = g(x)
之前,我们可以说 x = f()
在 y = g(x)
因为 happens before 是一个传递关系。
因此,上面的示例是有序的,因此没有数据争用。
线程冲突和数据竞争有区别吗
据我所知,当两个线程试图访问同一内存位置并且至少其中一个是写操作时,就会发生冲突操作。
Here 是维基百科关于数据竞争/竞争条件的说法。
它们有什么不同?
我终于找到了这个问题的好答案。
TL:DR:-
冲突操作 -
- 涉及多线程
- 正在访问相同的内存位置
- 其中至少有一个是写操作。
数据竞争 - 无序 冲突操作。
长版 -
我正在举例说明冲突操作是如何发生的,以及如何确定它们是否没有数据竞争。
考虑 Thread 1
和 Thread 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-with
和 happens-before
。因为 done
是原子的,所以它的一对操作彼此同步。此外,正因为如此,我们可以选择哪个操作 happens before
那对中的另一个。
现在因为 x = f()
在线程 1 中发生在 done.set(true)
之前,而 done.get()
在线程 2 中发生在 y = g(x)
之前,我们可以说 x = f()
在 y = g(x)
因为 happens before 是一个传递关系。
因此,上面的示例是有序的,因此没有数据争用。