我经常发现这些术语在并发编程的上下文中使用。他们是同一回事还是不同?
最佳答案
不,他们不是一回事。它们不是彼此的子集。它们既不是彼此的必要条件也不是充分条件。
数据争用的定义非常清楚,因此可以自动进行发现。当来自不同线程的2条指令访问同一内存位置时,就会发生数据争用,这些访问中的至少一个是写操作,并且没有同步规定这些访问之间的任何特定顺序。
竞争条件是语义错误。这是在事件的时序或顺序中发生的缺陷,它导致错误的程序行为。数据争用可能会导致许多争用条件,但这不是必需的。
考虑以下简单示例,其中x是共享变量:
Thread 1 Thread 2
lock(l) lock(l)
x=1 x=2
unlock(l) unlock(l)
在此示例中,线程1和2对x的写操作受到锁的保护,因此,它们始终以在运行时获取锁的顺序强制执行的某种顺序发生。也就是说,写入的原子性不能被破坏;在任何执行中,两次写入之间始终存在关系。我们只是不知道哪个写先于其他先验发生。
两次写入之间没有固定的顺序,因为锁无法提供这种顺序。如果程序的正确性受到损害,例如,线程2对x的写入之后,线程1对x的写入,则我们说存在竞争条件,尽管从技术上讲,没有数据竞争。
检测竞争条件比数据竞争要有用得多。但是,这也很难实现。
构造相反的示例也是微不足道的。 This博客文章还通过一个简单的银行交易示例很好地解释了这种差异。