std::unique_lock<Mutex>:: unique_lock
From cppreference.net
<
cpp
|
thread
|
unique lock
C++
Concurrency support library
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
std::unique_lock
| Member functions | ||||
|
unique_lock::unique_lock
|
||||
| Locking | ||||
| Modifiers | ||||
| Observers | ||||
| Non-member functions | ||||
|
unique_lock
(
)
noexcept
;
|
(1) | (начиная с C++11) |
|
unique_lock
(
unique_lock
&&
other
)
noexcept
;
|
(2) | (начиная с C++11) |
|
explicit
unique_lock
(
mutex_type
&
m
)
;
|
(3) | (начиная с C++11) |
|
unique_lock
(
mutex_type
&
m,
std::
defer_lock_t
t
)
noexcept
;
|
(4) | (начиная с C++11) |
|
unique_lock
(
mutex_type
&
m,
std::
try_to_lock_t
t
)
;
|
(5) | (начиная с C++11) |
|
unique_lock
(
mutex_type
&
m,
std::
adopt_lock_t
t
)
;
|
(6) | (начиная с C++11) |
|
template
<
class
Rep,
class
Period
>
unique_lock
(
mutex_type
&
m,
|
(7) | (начиная с C++11) |
|
template
<
class
Clock,
class
Duration
>
unique_lock
(
mutex_type
&
m,
|
(8) | (начиная с C++11) |
Создает
unique_lock
, опционально блокируя предоставленный мьютекс.
1)
Создает
unique_lock
без связанного мьютекса.
2)
Конструктор перемещения. Инициализирует
unique_lock
содержимым
other
. Оставляет
other
без связанного мьютекса.
3-8)
Создает
unique_lock
с
m
в качестве связанного мьютекса. Дополнительно:
3)
Блокирует связанный мьютекс, вызывая
m.
lock
(
)
.
4)
Не блокирует связанный мьютекс.
5)
Пытается заблокировать связанный мьютекс без блокировки, вызывая
m.
try_lock
(
)
. Поведение не определено, если
Mutex
не удовлетворяет требованиям
Lockable
.
6)
Предполагается, что вызывающий поток уже удерживает неразделяемую блокировку (т.е. блокировку, полученную с помощью
lock
,
try_lock
,
try_lock_for
, или
try_lock_until
) на
m
. Поведение не определено, если это не так.
7)
Пытается заблокировать связанный мьютекс, вызывая
m.
try_lock_for
(
timeout_duration
)
. Блокируется до истечения указанного
timeout_duration
или до получения блокировки, в зависимости от того, что наступит раньше. Может блокироваться дольше, чем
timeout_duration
. Поведение не определено, если
Mutex
не удовлетворяет требованиям
TimedLockable
.
8)
Пытается заблокировать связанный мьютекс, вызывая
m.
try_lock_until
(
timeout_time
)
. Блокируется до достижения указанного
timeout_time
или получения блокировки, в зависимости от того, что наступит раньше. Может блокироваться дольше, чем до достижения
timeout_time
. Поведение не определено, если
Mutex
не удовлетворяет требованиям
TimedLockable
.
Параметры
| other | - |
другой объект
unique_lock
для инициализации состояния
|
| m | - | мьютекс для ассоциации с блокировкой и опционального получения владения |
| t | - | параметр тега, используемый для выбора конструкторов с различными стратегиями блокировки |
| timeout_duration | - | максимальная длительность блокировки |
| timeout_time | - | максимальная временная точка для блокировки до достижения |
Пример
Запустить этот код
#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() { { // Примечание: можно использовать std::lock_guard или atomic<int> std::unique_lock<std::mutex> lk(m_a); ++a; } { // Примечание: подробности и альтернативы см. в std::lock и std::scoped_lock std::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 << "-е и " << a + 1 << "-е числа Фибоначчи: " << b << " и " << c << '\n'; }
Вывод:
12-е и 13-е числа Фибоначчи: 144 и 233