跳到主要内容

C++ 命名要求: SharedMutex (C++17 起)

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++ 命名要求: SharedMutex (C++17 起)

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