std::shared_lock<Mutex>::shared_lock
来自cppreference.com
<tbody>
</tbody>
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, const std::chrono::duration<Rep,Period>& timeout_duration ); |
(7) | (C++14 起) |
template< class Clock, class Duration > shared_lock( mutex_type& m, const std::chrono::time_point<Clock,Duration>& timeout_time ); |
(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 <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 << " 读取 i 为 " << ii << "...\n";
std::this_thread::sleep_for(std::chrono::milliseconds(10));
std::osyncstream(std::cout) << '#' << id << " 已醒来..." << std::endl;
}
int main()
{
std::thread r1{read_shared_var, 1};
std::thread r2{read_shared_var, 2};
r1.join();
r2.join();
}
可能的输出:
#2 读取 i 为 10...
#1 读取 i 为 10...
#2 已醒来...
#1 已醒来...