std::defer_lock_t,std::try_to_lock_t,std::adopt_lock_t (3) - Linux Manuals

std::defer_lock_t,std::try_to_lock_t,std::adopt_lock_t: std::defer_lock_t,std::try_to_lock_t,std::adopt_lock_t


std::defer_lock_t,std::try_to_lock_t,std::adopt_lock_t - std::defer_lock_t,std::try_to_lock_t,std::adopt_lock_t


Defined in header <mutex>
struct defer_lock_t { }; (since C++11)
struct try_to_lock_t { }; (until C++17)
struct adopt_lock_t { };
struct defer_lock_t { explicit defer_lock_t() = default; };
struct try_to_lock_t { explicit try_to_lock_t() = default; }; (since C++17)
struct adopt_lock_t { explicit adopt_lock_t() = default; };

std::defer_lock_t, std::try_to_lock_t and std::adopt_lock_t are empty struct tag types used to specify locking strategy for std::lock_guard, std::scoped_lock, std::unique_lock, and std::shared_lock.

Type Effect(s)
defer_lock_t do not acquire ownership of the mutex
try_to_lock_t try to acquire ownership of the mutex without blocking
adopt_lock_t assume the calling thread already has ownership of the mutex


// Run this code

  #include <mutex>
  #include <thread>

  struct bank_account {
      explicit bank_account(int balance) : balance(balance) {}
      int balance;
      std::mutex m;

  void transfer(bank_account &from, bank_account &to, int amount)
      // lock both mutexes without deadlock
      std::lock(from.m, to.m);
      // make sure both already-locked mutexes are unlocked at the end of scope
      std::lock_guard<std::mutex> lock1(from.m, std::adopt_lock);
      std::lock_guard<std::mutex> lock2(to.m, std::adopt_lock);

  // equivalent approach:
  // std::unique_lock<std::mutex> lock1(from.m, std::defer_lock);
  // std::unique_lock<std::mutex> lock2(to.m, std::defer_lock);
  // std::lock(lock1, lock2);

      from.balance -= amount;
      to.balance += amount;

  int main()
      bank_account my_account(100);
      bank_account your_account(50);

      std::thread t1(transfer, std::ref(my_account), std::ref(your_account), 10);
      std::thread t2(transfer, std::ref(your_account), std::ref(my_account), 5);


See also

adopt_lock tag constants used to specify locking strategy
              constructs a lock_guard, optionally locking the given mutex
constructor (public member function of std::lock_guard<Mutex>)
              constructs a unique_lock, optionally locking the supplied mutex
constructor (public member function of std::unique_lock<Mutex>)