Я нашел следующие 2 фрагмента кода:
-
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); }
Я хотел спросить, в чем разница и последствия использования любой из двух версий? (сначала заблокируйте или сначала создайте std::lock_guard
или std::unique_lock
?)