C++ 具名要求:共享互斥体 (SharedMutex)
共享互斥体 (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) :
- std::shared_mutex(C++17 起)
- std::shared_timed_mutex(C++14 起)