【问题标题】:Multithreading: Conflicting operations by threads vs data race多线程:线程与数据竞争的冲突操作
【发布时间】:2016-10-06 14:01:11
【问题描述】:

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

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

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

它们有何不同?

【问题讨论】:

    标签: multithreading pthreads race-condition


    【解决方案1】:

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

    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) 之前,在线程 2 中 done.get()y = g(x) 之前发生,我们可以说 x = f()y = g(x) 之前发生,因为发生在之前是传递关系。

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

    【讨论】:

      猜你喜欢
      • 2016-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多