如果我在函数内调用另一个函数,我应该解锁吗?

时间:2011-07-25 05:41:38

标签: c++ mutex

假设我有一个像这样的简单代码

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),那么我应该有两个互斥锁变量吗?或者我可以使用一个?提前谢谢..

3 个答案:

答案 0 :(得分:4)

如果A和B完全没有关联,并且在你打电话给B后你不会用A做任何其他事情,你应该先解锁。如果您不再访问A,则无需保留互斥锁。

如果你使用两个锁并且不总是以相同的顺序获得它们,你应该小心死锁。就像你按照未经修改的例子一样,锁定是按照A-B顺序获得的。如果您的程序中存在某种情况,您将以B-A顺序获取锁定,则可能会导致死锁。

您可以使用两个不同的锁或一个锁,具体取决于您需要的粒度级别。你是否介意在A上工作的功能阻止了在B上工作的所有其他功能。如果这对您来说是可以接受的,那么单锁将更容易管理。

答案 1 :(得分:1)

使用当前设计,您可能会面临死锁 - 如果某个其他线程已锁定lockB并尝试获取锁定lockA两个线程都被捕获。另一方面,释放锁定到lockA可能允许对共享数据进行不期望的并发访问。

所以你必须评估你的计划的需求。如果你想让两个线程同时访问多个变量(比如一致地修改这些变量),你应该对所有这些变量都有一个锁,并保持锁定直到你完成访问。

答案 2 :(得分:0)

假设没有从其他地方调用functionB(),那么只使用一个锁就足够了。

即使你需要使用两个锁,也要确保在它们锁定的共享变量的工作将不再使用时立即释放它们。

使用你拥有的场景,如果functionB()本身试图锁定A,你可能会陷入死锁。因此,最好在调用函数之前释放锁,这可能反过来尝试建立一个锁。