两个重叠的互斥锁会导致死锁吗?

Will two overlapping mutexes lead to deadlock?

本文关键字:死锁 两个 重叠      更新时间:2023-10-16

考虑以下成员函数。这会导致僵局吗?

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