|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
unique_lock::unique_lock | ||||
| Locking | ||||
| Modifiers | ||||
| Observers | ||||
| Non-member functions | ||||
unique_lock()noexcept; | (1) | (since C++11) |
unique_lock( unique_lock&& other)noexcept; | (2) | (since C++11) |
explicit unique_lock( mutex_type& m); | (3) | (since C++11) |
unique_lock( mutex_type& m,std::defer_lock_t t)noexcept; | (4) | (since C++11) |
unique_lock( mutex_type& m,std::try_to_lock_t t); | (5) | (since C++11) |
unique_lock( mutex_type& m,std::adopt_lock_t t); | (6) | (since C++11) |
template<class Rep,class Period> unique_lock( mutex_type& m, | (7) | (since C++11) |
template<class Clock,class Duration> unique_lock( mutex_type& m, | (8) | (since C++11) |
Constructs aunique_lock, optionally locking the supplied mutex.
unique_lock with no associated mutex.unique_lock with the contents ofother. Leavesother with no associated mutex.unique_lock withm as the associated mutex. Additionally:Mutex does not satisfyLockable.lock,try_lock,try_lock_for, ortry_lock_until) onm. The behavior is undefined if not so.Mutex does not satisfyTimedLockable.Mutex does not satisfyTimedLockable.| other | - | anotherunique_lock to initialize the state with |
| m | - | mutex to associate with the lock and optionally acquire ownership of |
| t | - | tag parameter used to select constructors with different locking strategies |
| timeout_duration | - | maximum duration to block for |
| timeout_time | - | maximum time point to block until |
#include <iostream>#include <mutex>#include <thread>#include <utility>#include <vector> std::mutex m_a, m_b, m_c;int a, b, c=1; void update(){{// Note: std::lock_guard or atomic<int> can be used insteadstd::unique_lock<std::mutex> lk(m_a);++a;} {// Note: see std::lock and std::scoped_lock for details and alternativesstd::unique_lock<std::mutex> lk_b(m_b,std::defer_lock);std::unique_lock<std::mutex> lk_c(m_c,std::defer_lock);std::lock(lk_b, lk_c); b=std::exchange(c, b+ c);}} int main(){std::vector<std::thread> threads;for(unsigned i=0; i<12;++i) threads.emplace_back(update); for(auto& i: threads) i.join(); std::cout<< a<<"'th and "<< a+1<<"'th Fibonacci numbers: "<< b<<" and "<< c<<'\n';}
Output:
12'th and 13'th Fibonacci numbers: 144 and 233