std::unique_lock
From cppreference.com
| Defined in header <mutex>
|
||
| template< class Mutex > class unique_lock; |
(since C++11) | |
The class unique_lock is a general-purpose mutex ownership wrapper allowing deferred locking, timed locking, recursive locking, transfer of lock ownership, and use with condition variables.
The unique_lock class is non-copyable, but it is movable. The supplied Mutex type shall implement the BasicLockable concept.
Contents |
Member types
| Type | Definition |
mutex_type
|
Mutex |
Member functions
constructs a unique_lock, optionally locking the supplied mutex (public member function) | |
| unlocks the associated mutex, if owned (public member function) | |
| unlocks the mutex, if owned, and acquires ownership of another (public member function) | |
Locking | |
| locks the associated mutex (public member function) | |
| tries to lock the associated mutex, returns if the mutex is not available (public member function) | |
attempts to lock the associated TimedLockable mutex, returns if the mutex has been unavailable for the specified time duration (public member function) | |
tries to lock the associated TimedLockable mutex, returns if the mutex has been unavailable until specified time point has been reached (public member function) | |
| unlocks the associated mutex (public member function) | |
Modifiers | |
| swaps state with another std::unique_lock (public member function) | |
| disassociates the associated mutex without unlocking it (public member function) | |
Observers | |
| returns a pointer to the associated mutex (public member function) | |
| tests whether the lock owns its associated mutex (public member function) | |
| tests whether the lock owns its associated mutex (public member function) | |
Non-member functions
specialization of std::swap for unique_lock (function template) | |
Example
#include <mutex> #include <thread> #include <chrono> struct bank_account { explicit bank_account(int balance) : balance(balance) {} int balance; std::mutex m; }; void slow_log(bank_account &from, bank_account &to, int amount) { // simulate a very slow logging operation std::this_thread::sleep_for(std::chrono::seconds(10)); } void transfer(bank_account &from, bank_account &to, int amount) { // don't actually take the locks yet std::unique_lock lock1(from.m, std::defer_lock); std::unique_lock lock2(to.m, std::defer_lock); // lock both unique_locks without deadlock std::lock(lock1, lock2); from.balance -= amount; to.balance += amount; // unlock the locks so the slow logging calls won't block eachother int from_copy = from.balance; int to_copy = to.balance; lock1.unlock(); lock2.unlock(); slow_log(from_copy, to_copy, amount); } int main() { bank_account my_account(100); bank_account your_account(50); std::thread t1(transfer, my_account, your_account, 10); std::thread t2(transfer, your_account, my_account, 5); t1.join(); t2.join(); }