考虑以下成员函数。它会导致僵局吗?
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);
}
答案 0 :(得分:1)
如果mu_
是std::mutex
,那么您就遇到了问题。 std :: mutex不支持递归锁定,并且不能被同一个线程锁定两次。请参阅:http://en.cppreference.com/w/cpp/thread/mutex
如果mu_
是std::recursive_mutex
,那么您没有问题。线程可以锁定递归互斥锁(如果它已经锁定)。见http://en.cppreference.com/w/cpp/thread/recursive_mutex