C++ 具名要求:共享互斥体 (SharedMutex) (C++17 起)
来自cppreference.com
共享互斥体 (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 起)