GSP
Quick Navigator

Search Site

Unix VPS
A - Starter
B - Basic
C - Preferred
D - Commercial
MPS - Dedicated
Previous VPSs
* Sign Up! *

Support
Contact Us
Online Help
Handbooks
Domain Status
Man Pages

FAQ
Virtual Servers
Pricing
Billing
Technical

Network
Facilities
Connectivity
Topology Map

Miscellaneous
Server Agreement
Year 2038
Credits
 

USA Flag

 

 

Man Pages
std::defer_lock,std::try_to_lock,std::adopt_lock(3) C++ Standard Libary std::defer_lock,std::try_to_lock,std::adopt_lock(3)

std::defer_lock,std::try_to_lock,std::adopt_lock - std::defer_lock,std::try_to_lock,std::adopt_lock


Defined in header <mutex>
constexpr std::defer_lock_t defer_lock {}; (since C++11)
(until C++17)
inline constexpr std::defer_lock_t defer_lock {}; (since C++17)
constexpr std::try_to_lock_t try_to_lock {}; (since C++11)
(until C++17)
inline constexpr std::try_to_lock_t try_to_lock {}; (since C++17)
constexpr std::adopt_lock_t adopt_lock {}; (since C++11)
(until C++17)
inline constexpr std::adopt_lock_t adopt_lock {}; (since C++17)


std::defer_lock, std::try_to_lock and std::adopt_lock are instances of empty struct
tag types std::defer_lock_t, std::try_to_lock_t and std::adopt_lock_t respectively.


They are used to specify locking strategies for std::lock_guard, 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>
#include <iostream>


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)
{
if(&from == &to) return; // avoid deadlock in case of self transfer


// 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 lock1{from.m, std::adopt_lock};
std::lock_guard 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};


t1.join();
t2.join();


std::cout << "my_account.balance = " << my_account.balance << "\n"
"your_account.balance = " << your_account.balance << '\n';
}


my_account.balance = 95
your_account.balance = 55


defer_lock_t
try_to_lock_t
adopt_lock_t tag type used to specify locking strategy
(C++11) (class)
(C++11)
(C++11)
constructor constructs a lock_guard, optionally locking the given mutex
(public member function of std::lock_guard<Mutex>)
constructs a unique_lock, optionally locking (i.e., taking ownership
constructor of) the supplied mutex
(public member function of std::unique_lock<Mutex>)

2022.07.31 http://cppreference.com

Search for    or go to Top of page |  Section 3 |  Main Index

Powered by GSP Visit the GSP FreeBSD Man Page Interface.
Output converted with ManDoc.