C++ 命名要求: SharedMutex (自 C++17 起)
来自 cppreference.cn
SharedMutex 要求扩展了 Mutex 要求,以包含共享锁所有权模式。
[编辑] 要求
此外,SharedMutex 类型的对象 m
支持另一种所有权模式:共享。多个线程(或更一般地说,执行代理)可以同时以共享模式拥有此互斥量,但是如果存在以独占模式拥有它的线程,则任何线程都不得获得共享所有权;并且如果存在以共享模式拥有它的线程,则任何线程都不得获得独占所有权。如果超过实现定义的线程数(不少于 10000)持有共享锁,则以共享模式获取互斥量的另一次尝试将阻塞,直到共享所有者的数量降至该阈值以下。
- 表达式 m.lock_shared() 具有以下属性
- 行为如同原子操作。
- 阻塞调用线程,直到可以获得互斥量的共享所有权。
- 在同一互斥量上先前的 m.unlock() 操作与此锁定操作同步(等效于 release-acquire std::memory_order)。
- 如果调用线程已以任何模式拥有互斥量,则行为未定义。
- 如果抛出异常,则不会获得共享锁。
- 表达式 m.try_lock_shared() 具有以下属性
- 行为如同原子操作。
- 尝试为调用线程获取互斥量的共享所有权,而不会阻塞。如果未获得所有权,则立即返回。即使互斥量当前未被任何线程以任何模式拥有,也允许该函数虚假地失败并返回。
- 如果
try_lock_shared()
成功,则同一对象上先前的unlock()
操作与此操作同步(等效于 release-acquire std::memory_order)。 - 如果调用线程已以任何模式拥有互斥量,则行为未定义。
- 表达式 m.unlock_shared() 具有以下属性
- 行为如同原子操作。
- 释放调用线程对互斥量的所有权,并与同一对象上后续成功的锁定操作同步。
- 如果调用线程不拥有互斥量,则行为未定义。
- 单个互斥量上的所有锁定和解锁操作都以单个总顺序发生。
[编辑] 标准库
以下标准库类型满足 SharedMutex 要求
(C++17) |
提供共享互斥设施 (类) |
(C++14) |
提供共享互斥设施并实现带超时的锁定 (类) |