当被调用方法使用与调用者相同的锁时,如何避免死锁?
我有一个名为 closeUnusedConnections() 的方法,它创建了一个 std::unique_lock
但它的调用者已经创建了一个 std::unique_lock
使用相同的 std::mutex
:Foo::m_myMutex。
在调用子程序之前是否必须释放锁?
观察:我无法整合这两种方法,因为 closeUnusedConnections 也是独立调用的。
部分代码:
void Foo::closeUnusedConnections()
{
std::unique_lock< std::mutex > lock( m_mtx );
// do stuff
}
Foo::CommNodePtr Foo::getConnection()
{
std::unique_lock< std::mutex > lock( m_mtx );
// do stuff
if( true /*some condition*/ )
{
lock.unlock(); // The goal is to avoid this unlock
// someone could get the lock between
// this unlock until closeUnusedConnections's lock.
closeUnusedConnections();
}
// etc
}
最佳答案
我认为在单个所有者线程之外访问对象是非常危险的,因为该对象可以被其他线程删除,在您的情况下关闭。互斥锁应该可以防止这些事情在它们拥有另一个线程时发生。
nos 的解决方案在你描述的情况下对你有用,但我觉得你最终会遇到其他问题,因为没有什么能阻止一个线程在调用后被另一个线程使用时关闭连接getConnection
.
我有点想知道您试图通过调用 getConnection
来完成什么,调用实际上可能会返回一个已关闭的连接。
我的建议是重新考虑您的工作流程,以便在任何给定时刻只有一个线程可以访问您的端口,即使这意味着只有一个线程可以使用该端口而其他线程必须发出工作请求。
关于c++ - 当被调用方法使用调用者已经锁定的相同锁时,如何避免死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43146228/