【发布时间】:2016-10-06 14:01:11
【问题描述】:
【问题讨论】:
标签: multithreading pthreads race-condition
【问题讨论】:
标签: multithreading pthreads race-condition
我终于找到了这个问题的好答案。
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) 之前,在线程 2 中 done.get() 在 y = g(x) 之前发生,我们可以说 x = f() 在 y = g(x) 之前发生,因为发生在之前是传递关系。
因此,上面的示例是有序的,因此没有数据竞争。
【讨论】: