C++ named requirements: SharedMutex (since C++17)
From cppreference.net
C++
C++ named requirements
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
SharedMutex 要求扩展了 Mutex 要求,包含了共享锁所有权模式。
要求
此外,
m
对象作为
SharedMutex
类型还支持另一种所有权模式:共享模式。多个线程(或更广义的执行代理)可以同时以共享模式持有该互斥锁,但若存在线程以独占模式持有该锁,则其他线程无法获得共享所有权;若存在线程以共享模式持有该锁,则其他线程无法获得独占所有权。当持有共享锁的线程数量超过实现定义的数量(不低于10000)时,后续尝试以共享模式获取该互斥锁的操作将被阻塞,直到共享所有者数量降至该阈值以下。
- 表达式 m. lock_shared ( ) 具有以下特性:
-
- 表现为原子操作。
- 阻塞调用线程直至获得互斥量的共享所有权。
- 同一互斥量上先前的 m. unlock ( ) 操作与此锁定操作形成同步关系(等效于释放-获取语义的 std::memory_order )。
- 若调用线程已以任何模式持有该互斥量,则行为未定义。
- 若抛出异常,则不会获得共享锁。
- 表达式 m. try_lock_shared ( ) 具有以下特性:
-
- 表现为原子操作。
- 尝试为调用线程获取互斥量的共享所有权而不阻塞。若未能获得所有权则立即返回。该函数允许虚假失败,即使互斥量当前未被任何线程以任何模式占用也可能返回失败。
-
若
try_lock_shared()成功,则同一对象上先前的unlock()操作与此操作形成同步关系(等效于释放-获取语义的 std::memory_order )。 - 若调用线程已以任何模式持有该互斥量,则行为未定义。
- 表达式 m. unlock_shared ( ) 具有以下特性:
-
- 表现为原子操作。
- 释放调用线程对互斥锁的所有权,并与同一对象后续成功的锁定操作建立 同步关系 。
- 若调用线程未持有该互斥锁,则行为未定义。
- 对单个互斥锁的所有加锁和解锁操作都遵循单一全序关系。
标准库
以下标准库类型满足 SharedMutex 要求:
|
(C++17)
|
提供共享互斥机制
(类) |
|
(C++14)
|
提供共享互斥机制并实现带超时的锁定功能
(类) |