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

Should I unlock if I call another function inside of a function?

本文关键字:函数 我应该 解锁 另一个 内部 调用 如果      更新时间:2023-10-16

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

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),那么我应该有两个互斥锁变量吗?还是我只能用一个?

如果A和B绝对不相关,并且在调用函数B后不会对A做任何其他操作,则应该首先解锁。如果不打算再访问A,则不需要保留互斥锁。

如果你使用两个锁并且不总是以相同的顺序获得它们,那么你应该小心死锁。就像您遵循未修改的示例一样,锁是按A-B顺序获得的。如果在你的程序中有这样一种情况,你将按B-A顺序获得锁,它可能会导致死锁。

您可以根据需要的粒度级别使用两个不同的锁或单个锁。你介意在A上工作的函数阻塞了所有在B上工作的函数吗?如果您可以接受,那么单锁将更容易管理。

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

所以你必须评估你的程序的需求。如果您希望两个线程同时访问多个变量(比如不断修改这些变量),那么您应该为所有这些变量设置一个锁,并保持该锁,直到您完成访问。

假设functionB()没有从其他任何地方调用,那么只使用一个锁是足够安全的。

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

在您的场景中,如果functionB()本身试图对a加锁,则可能会导致死锁。因此,在调用可能反过来尝试建立锁的函数之前释放锁是一种良好的做法。