我正在分析大量的多线程代码,我看到了这么多的锁。一些方法将有两个锁在这样的一行:同步代码味道?
ClassA::foo()
{
lockA.lock();
lockB.lock();
...//do some stuff
lockB.unlock();
lockA.unlock();
}
我的问题是很一般(我不能提供实际的代码)。这是代码味道吗?这通常是不好的做法?我无法证明代码可以被简化,但它看起来好像它是否被正确编码,不需要锁定两件事。锁应该管理一组需要同步的资源,对吧?如果有两个锁与资源管理重叠,那么是否会出现一些死锁问题?
如果您有任何见解,请让我知道。
感谢, JBU
如果另一个线程的方法确实是这样ClassB的::巴(){lockB.lock();洛卡。锁();做东西; lockA.unlock(); lockB.unlock();}(注意锁定顺序的逆转)那么存在死锁的条件是不是?也许要添加到您的答案,锁定需要按照一致的顺序完成? – jbu 2011-01-25 16:24:50
是的,锁定需要按照一致的顺序进行。 – 2011-01-25 16:27:55