如果在函数内部调用另一个函数,我应该解锁吗?
Should I unlock if I call another function inside of a function?
假设我有这样一个简单的代码
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加锁,则可能会导致死锁。因此,在调用可能反过来尝试建立锁的函数之前释放锁是一种良好的做法。
相关文章:
- 我应该声明所有不抛出 noexexcept 的成员/函数吗?
- 我应该在C++中将这些结构用作参数化构造函数吗?
- 从抽象类继承以创建另一个抽象类时,我应该重新声明所有虚函数吗?
- 我应该在 main 函数中写什么来测试我的问题?
- C++,我应该调用析构函数吗?
- 我应该提到纯虚函数中的调用约定吗?
- 我应该保留这个函数来查找第 n 个素数还是可以优化?
- C++ 我应该如何解释函数参数long(*pPointer)(OtherClass *const, long)?
- 我应该将哪种有效负载类型发送给webrtc::P ayloadRouter的构造函数?
- 我应该如何为包含动态数组的类编写所需的构造函数
- 我应该声明我的函数模板专业化还是定义它们就足够了
- 从函数打印 CLI 帮助消息后,我应该如何干净地退出 C++ 程序?
- 在为函数编写单元测试时,我应该模拟所做的内部函数调用吗?
- 我应该如何从函数返回对象?
- 我应该将 lambda 或函子用于比较函数吗?
- 我应该使用 const shared_ptr<T>&or shared_ptr<T> 作为我的 lambda 函数的参数吗?
- 从固定函数迁移到 GLSL OpenGL:我应该如何修改我的视图(lookAt)矩阵和透视矩阵?
- 我应该在C++中使用构造函数还是初始化函数
- 每个呼叫都会生成不同数字的函数:我应该通过引擎,分配还是两者兼而有之
- C++中的链表析构函数:我应该删除吗?