什么是比赛条件?

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

我向社会提出的问题是:

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

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

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

如果(x==5)//检查
{
y=x*2;//这个“动作”
//如果另一个线程在上面的“If(x==5)”和“y=x*2”之间更改了x,
//y不等于10。
}

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

为了防止出现争用情况,您通常会在共享数据周围设置一个锁,以确保一次只有一个线程可以访问数据。这意味着:

//获取x的锁
如果(x==5)
{
y=x*2;//现在,在释放锁之前,任何东西都不能更改x。
//因此y=10
}
//释放x的锁

发表评论