A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://cplusplus.com/reference/mutex/unique_lock/unique_lock/ below:

public member function

<mutex>

std::unique_lock::unique_lock default (1)
unique_lock() noexcept;
locking (2)
explicit unique_lock (mutex_type& m);
try-locking (3)
unique_lock (mutex_type& m, try_to_lock_t tag);
deferred (4)
unique_lock (mutex_type& m, defer_lock_t tag) noexcept;
adopting (5)
unique_lock (mutex_type& m, adopt_lock_t tag);
locking for (6)
template <class Rep, class Period>unique_lock (mutex_type& m, const chrono::duration<Rep,Period>& rel_time);
locking until (7)
template <class Clock, class Duration>unique_lock (mutex_type& m, const chrono::time_point<Clock,Duration>& abs_time);
copy [deleted] (8)
unique_lock (const unique_lock&) = delete;
move (9)
unique_lock (unique_lock&& x);

Construct unique_lock

Constructs a unique_lock:

(1) default constructor
The object manages no mutex object.
(2) locking initialization
The object manages m, and locks it (blocking, if necessary) by calling m.lock().
(3) try-locking initialization
The object manages m, and attempts to lock it (without blocking) by calling m.try_lock().
(4) deferred initialization
The object manages m without locking it. m shall be a mutex object that is not currently locked by the constructing thread.
(5) adopting initialization
The object manages m, which is a mutex object currently locked by the constructing thread (the object acquires ownership over the lock).
(6) locking for duration
The object manages m, and attempts to lock it during rel_time by calling m.try_lock_for(rel_time).
(7) locking until time point
The object manages m, and attempts to lock it before abs_time by calling m.try_lock_until(abs_time).
(8) copy construction [deleted]
unique_lock objects cannot be copied (copy constructor deleted).
(9) move construction
The object acquires the mutex managed by x, including its current owning state.
x is left in the same state as if default-constructed (referring to no mutex object).


The object manages the state of a mutex object by keeping a reference to it and information on whether it owns a lock on it.

Objects constructed with (2) and (5) always own a lock on the mutex object. Those with (1) and (4) never own a lock. For (3), (6) and (7), they own a lock if the locking attempt is successful.



Parameters
m
mutex object to be managed by the unique_lock object.
mutex_type is unique_lock's template parameter (the type of the managed mutex object).
tag
This tag argument is merely used to select a specific constructor (values of these types have no state).
It is one of the following values:
value description (no tag) Lock on construction by calling member lock. try_to_lock Attempt to lock on construction by calling member try_lock defer_lock Do not lock on construction (and assume it is not already locked by thread) adopt_lock Adopt current lock (assume it is already locked by thread). try_to_lock_t, defer_lock_t and adopt_lock_t are the types of objects try_to_lock, defer_lock and adopt_lock, respectively.
rel_time
The maximum time span during which the thread could block waiting to acquire a lock. If exhausted, the object is initialized not owning a lock.
duration is an object that represents a specific relative time.
abs_time
A point in time at which the thread will stop blocking waiting to acquire a lock. If reached, the object is initialized not owning a lock.
time_point is an object that represents a specific absolute time.
x
Another unique_lock object.

Example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// unique_lock constructor example
#include <iostream>       // std::cout
#include <thread>         // std::thread
#include <mutex>          // std::mutex, std::lock, std::unique_lock
                          // std::adopt_lock, std::defer_lock
std::mutex foo,bar;

void task_a () {
  std::lock (foo,bar);         // simultaneous lock (prevents deadlock)
  std::unique_lock<std::mutex> lck1 (foo,std::adopt_lock);
  std::unique_lock<std::mutex> lck2 (bar,std::adopt_lock);
  std::cout << "task a\n";
  // (unlocked automatically on destruction of lck1 and lck2)
}

void task_b () {
  // foo.lock(); bar.lock(); // replaced by:
  std::unique_lock<std::mutex> lck1, lck2;
  lck1 = std::unique_lock<std::mutex>(bar,std::defer_lock);
  lck2 = std::unique_lock<std::mutex>(foo,std::defer_lock);
  std::lock (lck1,lck2);       // simultaneous lock (prevents deadlock)
  std::cout << "task b\n";
  // (unlocked automatically on destruction of lck1 and lck2)
}


int main ()
{
  std::thread th1 (task_a);
  std::thread th2 (task_b);

  th1.join();
  th2.join();

  return 0;
}

Possible output (order of lines may vary):


Data races Argument m may be accessed or modified (as an atomic operation, causing no data races).
The object keeps a reference to m, which may be accessed or modified by its operations.
The move constructor (9) modifies x.

Exception safety If the mutex object supports the operation applied to m (if any) in its current state, the constructor never throws exceptions (no-throw guarantee).
Otherwise, it causes undefined behavior.

See also
unique_lock::lock
Lock mutex (public member function)
unique_lock::try_lock
Lock mutex if not locked (public member function)
unique_lock::try_lock_for
Try to lock mutex during time span (public member function)
unique_lock::try_lock_until
Try to lock mutex until time point (public member function)
unique_lock::~unique_lock
Destroy unique_lock (public member function)

RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4