std::shared_lock<Mutex>::shared_lock
来自cppreference.com
< cpp | thread | shared lock
并发支持库
|
|
std::shared_lock
成员函数 | ||||
shared_lock::shared_lock
|
||||
共享锁定 | ||||
修改器 | ||||
观察器 | ||||
非成员函数 | ||||
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) 移动构造函数。以
other
的内容初始化 shared_lock
。令 other
不关联到互斥。3-8) 构造
shared_lock
,以
m
为关联的互斥。另外:3) 通过调用 m.lock_shared()
,以共享模式锁定关联的互斥。
4) 不锁定关联的互斥。
5) 尝试通过调用 m.try_lock_shared()
,以共享模式锁定关联的互斥而不阻塞。
6) 假设调用方线程已在
m
上持有共享锁(即由 lock_shared
、 try_lock_shared
、
try_lock_shared_for
或 try_lock_shared_until
取得的锁)。若非如此则行为未定义。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 <shared_mutex> #include <iostream> #include <thread> #include <chrono> std::shared_timed_mutex m; int i = 10; using namespace std::chrono; void read() { // 两个线程都获得对整数 i 的访问 std::shared_lock<std::shared_timed_mutex> slk(m); std::cout << "read i as " << i << "...\n"; // 此不同步 std::this_thread::sleep_for(10ms); std::cout << "woke up...\n"; } int main() { std::thread(read).join(); std::thread(read).join(); return 0; }