std::shared_lock<Mutex>::shared_lock

来自cppreference.com
< cpp‎ | thread‎ | shared lock
 
 
线程支持库
线程
(C++11)
(C++20)
(C++20)
this_thread 命名空间
(C++11)
(C++11)
(C++11)
互斥
(C++11)
通用锁管理
(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
(C++11)
(C++11)
条件变量
(C++11)
信号量
闩与屏障
(C++20)
(C++20)
future
(C++11)
(C++11)
(C++11)
(C++11)
 
 
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
7) 尝试通过调用 m.try_lock_shared_until(timeout_duration) ,以共享模式锁定关联的互斥,这会阻塞直到经过指定的 timeout_duration 或取得锁,两者的先到来者。可能锁定长于 timeout_duration 。若此线程已以任何模式占有互斥则行为未定义。
8) 尝试通过调用 m.try_lock_shared_for(timeout_time) ,以共享模式锁定关联的互斥,这会阻塞直到抵达指定的 timeout_time 或取得锁,两者的先到来者。可能锁定长于到抵达 timeout_time 为止。若此线程已以任何模式占有互斥则行为未定义。

[编辑] 参数

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;
 
void read()
{
   // 两个线程都获得对整数 i 的访问
   std::shared_lock<std::shared_timed_mutex> slk(m);
   std::cout << "read i as " << i << "...\n"; // 此不同步
   std::this_thread::sleep_for(std::chrono::milliseconds(10));
   std::cout << "woke up...\n";
}
 
int main()
{
   std::thread r1(read);
   std::thread r2(read);
 
   r1.join();
   r2.join();
   return 0;
}