ten*_*our 5 c++ winapi multithreading visual-c++
我继承了一个历史悠久的大项目,我的任务是修复多年来报告的一系列僵局。
我了解一些死锁的性质,并且可以使用一些经过仔细放置Sleeps的时间和其他强制定时来一致地重现它们。
但是,解决僵局并不是那么简单。该代码没有关于锁定资源的任何策略编写。我可以为每个死锁手工制定解决方案,但是其中很多归结为锁排序问题。
例如,工人1:
Acquires resource A
{
...
Acquires resource B
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
当工作人员2执行此操作时:
Acquires resource B
{
...
Acquires resource A
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:检测和/或强制执行代码中的锁顺序问题的最佳方法是什么?静态分析?有没有一种编译时方法可以检测到此(理想情况)?还是我必须在运行时检测这种问题?
任何帮助表示赞赏。
有一个简单的策略可以发现潜在的僵局。如果一位代码先锁定 A,然后锁定 B,而另一位代码先锁定 B,然后锁定 A,就会发生死锁。如果他们在错误的时间执行此操作,则会出现死锁。如果他们在没有造成伤害的情况下这样做,则可能会陷入僵局。假设第一个代码是正确的,那么第二个代码不应尝试按该顺序使用锁(您必须确定哪个代码是错误的,哪个是正确的)。
为每个锁分配一个整数值。假设锁 A = 100,锁 B = 130。然后你制定一个规则:当持有一个值为 X 的锁时,只有当它的值 Y > X 时才必须获取另一个锁。代码锁定 B 然后 A 违反了条件。
显然,这需要对所有锁进行一些封装才能实际检查这一点。如果发现违规,则必须决定是否更改代码或分配给锁的值,直到不再发现潜在的死锁。