# std::shared_lock<Mutex>::shared_lock

< cpp‎ | thread‎ | 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, 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 <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;
    }