c++ - 当被调用方法使用调用者已经锁定的相同锁时,如何避免死锁?

标签 c++ c++11 mutex

被调用方法使用与调用者相同的锁时,如何避免死锁?

我有一个名为 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/

相关文章:

c++ - 删除标准列表中的指针对象

c++ - 编译时模板 `std::integral_constant` 计数器 - 如何实现它?

c++ - 如何在 C++ 头文件中定义字符串参数 - 与 Swift 桥接?

c++ - 如何加载和更新 XML

c++ - 仅 header 库中匿名命名空间的替代方案

c# - 如何使用互斥锁

process - 从锁定互斥锁的进程退出会导致死锁吗?

c++ - 你会如何优化这个功能?

c++ - BSON 类型和 std::chrono

c - 段错误(核心转储)错误消息