我发现了以下2件代码:第一次锁定和创建lock_guard(adopt_lock)并创建unique_lock(defer_lock)和锁定有什么区别?
http://en.cppreference.com/w/cpp/thread/lock
void assign_lunch_partner(Employee &e1, Employee &e2) { // use std::lock to acquire two locks without worrying about // other calls to assign_lunch_partner deadlocking us { // m is the std::mutex field std::unique_lock<std::mutex> lk1(e1.m, std::defer_lock); std::unique_lock<std::mutex> lk2(e2.m, std::defer_lock); std::lock(lk1, lk2); // ... } }
http://www.amazon.com/C-Concurrency-Action-Practical-Multithreading/dp/1933988770
void swap(X& lhs, X&rhs){ if(&lhs == &rhs) return; // m is the std::mutex field std::lock(lhs.m, rhs.m); std::lock_guard<std::mutex> lock_a(lhs.m, std::adopt_lock); std::lock_guard<std::mutex> lock_b(rhs.m, std::adopt_lock); swap(lhs.some_detail, rhs.some_detail); }
我要问的是什么的差异和后果使用2种版本中(首先锁定或首先创建std::lock_guard
或std::unique_lock
?)
在C++ 17中,['std :: scoped_lock'](http://en.cppreference.com/w/cpp/thread/scoped_lock)会更加优雅地解决这两个问题。 – Nawaz 2017-01-18 17:10:18