什么是竞争条件?

2024-05-23

编写多线程应用程序时,最常见的问题之一是竞争条件。

我向社区提出的问题是:

  • 竞赛条件是什么?
  • 你如何检测它们?
  • 你如何处理它们?
  • 最后,如何防止它们发生?

当两个或多个线程可以访问共享数据并且它们试图同时更改它时,就会出现竞争条件。由于线程调度算法可以随时在线程之间交换,因此您不知道线程尝试访问共享数据的顺序。因此,数据更改的结果取决于线程调度算法,即两个线程都“竞相”访问/更改数据。

当一个线程执行“检查然后执行”操作(例如,“检查”值是否为 X,然后“执行”执行取决于值为 X 的操作)而另一个线程对中的值执行某些操作时,经常会出现问题介于“检查”和“行动”之间。例如:

if (x == 5) // The "Check"
{
   y = x * 2; // The "Act"

   // If another thread changed x in between "if (x == 5)" and "y = x * 2" above,
   // y will not be equal to 10.
}

重点是,y 可以是 10,也可以是任何值,具体取决于另一个线程是否在检查和操作之间更改了 x。你没有真正的方法知道。

为了防止竞争条件发生,您通常会在共享数据周围加一把锁,以确保一次只有一个线程可以访问该数据。这意味着这样的事情:

// Obtain lock for x
if (x == 5)
{
   y = x * 2; // Now, nothing can change x until the lock is released. 
              // Therefore y = 10
}
// release lock for x
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是竞争条件? 的相关文章

随机推荐