两个重叠的互斥锁会导致死锁吗?
Will two overlapping mutexes lead to deadlock?
考虑以下成员函数。这会导致僵局吗?
void foo::insert(item_ptr item)
{
lock_guard<mutex> lock(mu_);
items_.insert(item);
}
void foo::insert(vector<item_ptr> items)
{
lock_guard<mutex> lock(mu_); // will this lead
// to deadlock?
for(auto item:items)
insert(item);
}
如果mu_
是std::mutex
,那么您就有问题了。std::互斥锁不支持递归锁,不能被同一个线程锁定两次。参见:http://en.cppreference.com/w/cpp/thread/mutex
如果mu_
是std::recursive_mutex
,则没有问题。如果线程已经锁定了递归互斥对象,则可以锁定该互斥对象。见http://en.cppreference.com/w/cpp/thread/recursive_mutex
相关文章:
- 具有两个独占锁组的共享锁
- 如果两个线程相互依赖,则 cpp 线程连接应使用连接导致死锁
- 仅锁定两个可能的互斥锁之一
- 死锁使用 std::mutex 来保护多个线程中的 cout
- 当用2个螺纹锁定时,将recursive_mutex死锁
- 单个生产者/多个消费者死锁
- 原子功能无锁可以更改两个独立的存储位置
- C++:带有"std::lock_guard"的互斥锁是否足以同步两个"std::thre
- 解决死锁问题,在主线程中等待多个工作线程完成 (C++11)
- 两个提升的无锁队列会导致僵局
- 两个std :: unique_lock在同一静音上使用会导致死锁
- C ++两个锁比一个锁好
- 两个条件变量和避免死锁
- 在两个不同的类中使用 Boost 互斥锁
- 具有两个原子的自旋锁的最小限制内存排序
- 正在搜索交换两个关联容器的无锁可能性
- 如何使两个线程严格交替使用互斥锁
- 两个重叠的互斥锁会导致死锁吗?
- 两个unique_ptr<T>的无锁交换
- 我们可以在不锁定两个或更多无锁容器的情况下原子地做一些事情吗?