Namespaces
Variants

C++ named requirements: SharedMutex (since C++17)

From cppreference.net
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 要求:

提供共享互斥机制
(类)
提供共享互斥机制并实现带超时的锁定功能
(类)

参见