如何避免recursive_mutex
How to avoid recursive_mutex
我有一个recursive_mutex的情况,我正在尝试解决。这是解释问题的一段代码。
void OnConnectionDisconnected()
{
boost::lock_guard<boost::mutex> lock ( m_mutexConnectionSet );
IPCSyncConnectionSharedPtrSet::iterator it = m_IPCSyncConnectionSet.find(spConnection);
if ( it != m_IPCSyncConnectionSet.end())
{
m_IPCSyncConnectionSet.erase(*it);
}
}
void ShutdownServer()
{
boost::lock_guard<boost::mutex> lock ( m_mutexConnectionSet );
IPCSyncConnectionSharedPtrSet::iterator it = m_IPCSyncConnectionSet.begin();
for (; it != m_IPCSyncConnectionSet.end(); )
{
if (*it)
{
IPCSyncConnectionSharedPtr spIPCConnection = (*it);
it++;
//This call indirectly calls OnConnectionDisconnected and erase the connection.
spIPCConnection->Disconnect();
}
else
{
++it;
}
}
}
OnConnection断开连接在多个线程上调用(n),并且在连接处于活动状态或断开连接时,任何时候仅在一个线程上调用ShutdownServer。关闭服务器遍历所有连接并在每个连接上调用断开连接,这间接调用OnConnection断开连接,我实际上擦除了连接。我在访问m_IPCSyncConnectionSet之前锁定了互斥锁,因为连接集在其他线程中被修改。
我需要在上面的示例代码中使用recursive_mutex,因为当调用 Shutdown 时,互斥锁在同一线程上被锁定两次。
任何人都可以建议如何解决上述问题并避免recursive_lock? recurive_mutex会按照这篇文章杀死你 http://www.fieryrobot.com/blog/2008/10/14/recursive-locks-will-kill-you/
谢谢
在ShutdownServer()
使用容器的临时副本。除了锁定问题之外,迭代被另一个函数修改的容器不是一个好主意(即使这种特定的容器类型在擦除元素时不会使所有迭代器失效,这样的代码也会非常脆弱且不必要地复杂)。
void ShutdownServer()
{
boost::lock_guard<boost::mutex> lock ( m_mutexConnectionSet );
auto connections = m_IPCSyncConnectionSet;
lock.unlock();
for (auto it = connections.begin(); it != connections.end(); ++it)
if (*it)
(*it)->Disconnect();
}
现在,您既不需要关心锁定,也不需要关心迭代器的有效性。
相关文章:
- 如何在没有死锁和/或争用的情况下正确使用 std::mutex C++?
- std::mutex 如何防止线程修改?
- DRD 报告"conflicting load" std::mutex::lock 上的错误
- 是否需要 mutex() 来安全地同时访问具有 2 个线程的数组的不同元素?
- std::atomic 和 std::mutex 的相对性能
- 如何解决"'mutex' in namespace 'std' does not name a type"?
- Recursive lambda C++17
- std::lock_guard 怎么可能比 std::mutex::lock() 更快?
- 当"std::lock_guard<std::mutex>"对象没有名称时的不同行为
- std::mutex::lock() 产生奇怪(和不必要的)ASM 代码
- 使用 std::mutex 保护环路
- std::mutex作为一个成员变量对多个线程来说是安全的吗
- std::shared_timed_mutex何时比std::mutex慢,以及何时(不)使用它
- <mutex> 使用 /clr 或 /clr:pure 编译时不支持
- std::mutex 的发布-获取可见性保证是否仅适用于关键部分?
- 死锁使用 std::mutex 来保护多个线程中的 cout
- 返回持有 std::mutex 锁的 RAII 容器类
- 在 C++11 线程中,std::mutex 对内存可见性有什么保证?
- "How to make a recursive call for palindrom numbers without reverse function in c++?"
- 在任何地方对C++中所有并行线程中的所有锁定和解锁实例使用相同的 std::mutex 和 lock 对象