C++ 如果调用函数中的另一个函数,是否应解锁?

C++ 如果调用函数中的另一个函数,是否应解锁?,c++,mutex,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); } 我想知道我是否应该在调用funct

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

functionA(){
     lock(lockA);

     //doing something with a shared data;
     functionB();
     unLock(lockA);
}

functionB(){
     lock(lockB);
     //doting something with another shared data
     unLock(lockB);
}

我想知道我是否应该在调用functionB之前解锁,或者这无关紧要。如果我有两个共享数据(A和B),那么我应该有两个互斥锁变量吗?或者我可以用一个吗?提前感谢..

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


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

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

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

您可以只使用两个不同的锁,也可以使用一个锁,具体取决于所需的粒度级别。你介意在A上工作的函数和在B上工作的所有其他函数吗。如果这对您来说是可以接受的,那么单锁将更易于管理。

假设没有从其他任何地方调用
functionB()
,只使用一个锁就足够安全了

即使您需要使用两个锁,也要确保在它们锁定的共享变量不再使用时尽快释放它们


在您的场景中,如果
functionB()
本身试图锁定a,您可能会陷入死锁。因此,在调用函数之前释放锁是一种很好的做法,而函数反过来可能试图建立锁。

我可以从函数b中取出锁/解锁吗?因为函数b具有锁/解锁功能?如果您决定只使用一个锁,您肯定可以从函数b中移除锁/解锁。但是,请确保如果另一个函数也调用函数B,那么在调用函数B之前,它还必须获得锁。在我的情况下,函数A是调用函数B的唯一位置。因此,我想我可以从函数B获得锁/解锁。谢谢你的回答。但我不明白“functionB()本身试图在a上加锁”这一部分。从代码上看,functionB只会尝试锁定B。你能给我一个例子,在什么情况下functionB可能会这样做吗?提前感谢..我知道它不会锁定,但我想说的是,如果您必须修改代码或某些外部函数,这些函数也可能会锁定。您将得到Szere Dyeri所描述的死锁。可以使用A来确保您不会死锁。您必须(例如,持有锁时)。您还必须确保解锁前系统状态一致,并且必须确保在调用外部代码后重新获取锁并恢复是安全的(例如,请记住,当您未持有锁时,其他人可能已更改共享状态)。