std::shared_lock<Mutex>:: shared_lock
From cppreference.net
<
cpp
|
thread
|
shared lock
C++
Concurrency support library
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
std::shared_lock
| Member functions | ||||
|
shared_lock::shared_lock
|
||||
| Shared locking | ||||
| Modifiers | ||||
| Observers | ||||
| Non-member functions | ||||
|
shared_lock
(
)
noexcept
;
|
(1) | (начиная с C++14) |
|
shared_lock
(
shared_lock
&&
other
)
noexcept
;
|
(2) | (начиная с C++14) |
|
explicit
shared_lock
(
mutex_type
&
m
)
;
|
(3) | (начиная с C++14) |
|
shared_lock
(
mutex_type
&
m,
std::
defer_lock_t
t
)
noexcept
;
|
(4) | (начиная с C++14) |
|
shared_lock
(
mutex_type
&
m,
std::
try_to_lock_t
t
)
;
|
(5) | (начиная с C++14) |
|
shared_lock
(
mutex_type
&
m,
std::
adopt_lock_t
t
)
;
|
(6) | (начиная с C++14) |
|
template
<
class
Rep,
class
Period
>
shared_lock
(
mutex_type
&
m,
|
(7) | (начиная с C++14) |
|
template
<
class
Clock,
class
Duration
>
shared_lock
(
mutex_type
&
m,
|
(8) | (начиная с C++14) |
Создает
shared_lock
, опционально блокируя предоставленный мьютекс.
1)
Создает
shared_lock
без связанного мьютекса.
2)
Конструктор перемещения. Инициализирует
shared_lock
содержимым
other
. Оставляет
other
без связанного мьютекса.
3-8)
Создает
shared_lock
с
m
в качестве ассоциированного мьютекса. Дополнительно:
3)
Блокирует связанный мьютекс в режиме разделяемого доступа, вызывая
m.
lock_shared
(
)
.
4)
Не блокирует связанный мьютекс.
5)
Пытается захватить связанный мьютекс в разделяемом режиме без блокировки, вызывая
m.
try_lock_shared
(
)
.
6)
Предполагается, что вызывающий поток уже удерживает разделяемую блокировку (т.е. блокировку, полученную с помощью
lock_shared
,
try_lock_shared
,
try_lock_shared_for
, или
try_lock_shared_until
) на
m
. Поведение не определено, если это не так.
7)
Пытается заблокировать связанный мьютекс в режиме разделения, вызывая
m.
try_lock_shared_for
(
timeout_duration
)
, что блокирует до истечения указанного
timeout_duration
или до получения блокировки, в зависимости от того, что наступит раньше. Может блокировать дольше, чем
timeout_duration
. Поведение не определено, если
Mutex
не удовлетворяет требованиям
SharedTimedLockable
.
8)
Пытается заблокировать связанный мьютекс в режиме разделения, вызывая
m.
try_lock_shared_until
(
timeout_time
)
, что блокирует до достижения указанного
timeout_time
или получения блокировки, в зависимости от того, что наступит раньше. Может блокировать дольше, чем до достижения
timeout_time
. Поведение не определено, если
Mutex
не удовлетворяет требованиям
SharedTimedLockable
.
Параметры
| other | - |
другой
shared_lock
для инициализации состояния
|
| m | - | мьютекс для ассоциации с блокировкой и опционального получения владения |
| t | - | параметр-тег, используемый для выбора конструкторов с различными стратегиями блокировки |
| timeout_duration | - | максимальная длительность блокировки |
| timeout_time | - | максимальная точка времени для блокировки до |
Пример
Запустить этот код
#include <chrono> #include <iostream> #include <shared_mutex> #include <syncstream> #include <thread> std::shared_timed_mutex m; int i = 10; void read_shared_var(int id) { // оба потока получают доступ к целочисленной переменной i std::shared_lock<std::shared_timed_mutex> slk(m); const int ii = i; // читает глобальную переменную i std::osyncstream(std::cout) << '#' << id << " read i as " << ii << "...\n"; std::this_thread::sleep_for(std::chrono::milliseconds(10)); std::osyncstream(std::cout) << '#' << id << " woke up..." << std::endl; } int main() { std::thread r1{read_shared_var, 1}; std::thread r2{read_shared_var, 2}; r1.join(); r2.join(); }
Возможный вывод:
#2 read i as 10... #1 read i as 10... #2 woke up... #1 woke up...