命名空间
变体
操作

C++ 命名需求: SharedMutex (自 C++17 起)

来自 cppreference.com
 
 
C++ 命名需求
 

The SharedMutex 需求扩展了 Mutex 需求,以包含共享锁所有权模式。

[编辑] 需求

此外,SharedMutex 类型的对象 m 支持另一种所有权模式:共享。多个线程(或者更一般地说,执行代理)可以同时以共享模式拥有此互斥锁,但是如果存在以独占模式拥有它的线程,则任何线程都无法获得共享所有权,并且如果存在以共享模式拥有它的线程,则任何线程都无法获得独占所有权。如果超过实现定义的线程数量(不少于 10000)持有共享锁,则尝试以共享模式获取互斥锁的任何其他线程将被阻塞,直到共享所有者数量降至该阈值以下。

  • 表达式 m.lock_shared() 具有以下属性
  • 表现为原子操作。
  • 阻塞调用线程,直到能够获得互斥锁的共享所有权。
  • 先前的 m.unlock() 操作与同一互斥锁上的此锁定操作同步(等效于释放-获取 std::memory_order)。
  • 如果调用线程已经以任何模式拥有互斥锁,则行为未定义。
  • 如果抛出异常,则不会获取共享锁。
  • 表达式 m.try_lock_shared() 具有以下属性
  • 表现为原子操作。
  • 尝试为调用线程获取互斥锁的共享所有权,而不进行阻塞。如果未获得所有权,则立即返回。即使互斥锁当前未被任何线程以任何模式拥有,该函数也允许发生虚假失败并返回。
  • 如果 try_lock_shared() 成功,则先前对同一对象的 unlock() 操作同步于此操作(等效于释放-获取 std::memory_order)。
  • 如果调用线程已经以任何模式拥有互斥锁,则行为未定义。
  • 表达式 m.unlock_shared() 具有以下属性
  • 表现为原子操作。
  • 释放调用线程对互斥锁的所有权,并同步于随后对同一对象的成功锁定操作。
  • 如果调用线程不拥有互斥锁,则行为未定义。
  • 对单个互斥锁的所有锁定和解锁操作都按单个总顺序发生。

[编辑] 库类型

以下标准库类型满足 SharedMutex

[编辑] 另请参阅