假设我有一个像这样的简单代码
functionA(){
lock(lockA);
//doing something with a shared data;
functionB();
unLock(lockA);
}
functionB(){
lock(lockB);
//doting something with another shared data
unLock(lockB);
}
我想知道在调用functionB之前是否应该解锁或者无关紧要。另外,如果我有2个共享数据(A和B),那么我应该有两个互斥锁变量吗?或者我可以使用一个?提前谢谢..
答案 0 :(得分:4)
如果A和B完全没有关联,并且在你打电话给B后你不会用A做任何其他事情,你应该先解锁。如果您不再访问A,则无需保留互斥锁。
如果你使用两个锁并且不总是以相同的顺序获得它们,你应该小心死锁。就像你按照未经修改的例子一样,锁定是按照A-B顺序获得的。如果您的程序中存在某种情况,您将以B-A顺序获取锁定,则可能会导致死锁。
您可以使用两个不同的锁或一个锁,具体取决于您需要的粒度级别。你是否介意在A上工作的功能阻止了在B上工作的所有其他功能。如果这对您来说是可以接受的,那么单锁将更容易管理。
答案 1 :(得分:1)
使用当前设计,您可能会面临死锁 - 如果某个其他线程已锁定lockB
并尝试获取锁定lockA
两个线程都被捕获。另一方面,释放锁定到lockA
可能允许对共享数据进行不期望的并发访问。
所以你必须评估你的计划的需求。如果你想让两个线程同时访问多个变量(比如一致地修改这些变量),你应该对所有这些变量都有一个锁,并保持锁定直到你完成访问。
答案 2 :(得分:0)
假设没有从其他地方调用functionB()
,那么只使用一个锁就足够了。
即使你需要使用两个锁,也要确保在它们锁定的共享变量的工作将不再使用时立即释放它们。
使用你拥有的场景,如果functionB()
本身试图锁定A,你可能会陷入死锁。因此,最好在调用函数之前释放锁,这可能反过来尝试建立一个锁。