可以强制执行/检测锁定顺序以防止死锁吗?

时间:2014-05-12 16:04:00

标签: c++ multithreading winapi visual-c++

我继承了一个历史悠久的大项目,我的任务是解决多年来报道的一系列僵局。

我了解一些死锁的性质,并且可以使用一些精心放置的Sleeps和其他强制时间来一致地重现它们。

但是,修复死锁并不是那么简单。代码不是用任何关于锁定资源的策略编写的。我可以为每个死锁手工制作解决方案,但其中很大一部分归结为锁定顺序问题。

例如,工人1:

Acquires resource A
{
  ...
  Acquires resource B
  {
    ...
  }
}

虽然工人2这样做:

Acquires resource B
{
  ...
  Acquires resource A
  {
    ...
  }
}

所以我的问题是:在代码中检测和/或执行锁定排序问题的最佳方法是什么?静态分析?是否有编译时检测此方法(理想)?或者我必须在运行时检测这种问题吗?

感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

有一个简单的策略可以找到潜在的死锁。如果一位代码锁定A,然后是B,则会发生死锁,而另一位代码锁定B,然后是A.如果他们在错误的时间执行此操作,则会出现死锁。如果他们在没有造成伤害的情况下这样做,那就是潜在的僵局。假设第一个代码是正确的,那么第二个代码不应该尝试按顺序使用锁(您必须确定哪个代码是错误的,哪个是正确的)。

为每个锁分配一个整数值。假设锁A = 100,锁B = 130.然后你制定一个规则:当持有一个值为X的锁时,只有当它具有值Y> 1时才能获得另一个锁。 X.代码锁定B然后A违反了条件。

显然,需要对所有锁进行一些封装来实际检查这一点。如果发现违规,则必须决定是否更改代码或分配给锁的值,直到您停止发现潜在的死锁。