void foo(X& a,X& b){ std::unique_lock lock_a(a.m,std::defer_lock); std::unique_lock lock_b(b.m,std::defer_lock); std::lock(lock_a,lock_b); // do the whole work with a and b }