C++ 命名要求: 互斥量 (自 C++11 起)
来自 cppreference.com
该 互斥量 要求扩展了 可锁定 要求,包括线程间同步。
内容 |
[编辑] 要求
对于 互斥量 类型的对象 m
- 表达式 m.lock() 具有以下属性
- 表现为原子操作。
- 阻塞调用线程,直到获得互斥量的独占所有权。
- 先前的 m.unlock() 操作在同一互斥量上与该锁定操作同步(等效于发布-获取 std::memory_order)。
- 如果调用线程已经拥有互斥量,则行为未定义(除非 m 是 std::recursive_mutex 或 std::recursive_timed_mutex)。
- 类型为 std::system_error 的异常可能会在错误时抛出,错误代码如下
- std::errc::operation_not_permitted 如果调用线程没有所需的权限。
- std::errc::resource_deadlock_would_occur 如果实现检测到该操作会导致死锁。
- 表达式 m.try_lock() 具有以下属性
- 表现为原子操作。
- 尝试在不阻塞的情况下为调用线程获取互斥量的独占所有权。如果未获得所有权,则立即返回。即使互斥量当前未被其他线程拥有,该函数也可能虚假失败并返回。
- 如果
try_lock()
成功,则先前的unlock()
操作在同一对象上与该操作同步(等效于发布-获取 std::memory_order)。lock()
与失败的try_lock()
不同步。 - 不抛出异常。
- 表达式 m.unlock() 具有以下属性
- 表现为原子操作。
- 释放调用线程对互斥量的所有权,并与后续对同一对象的成功锁定操作同步。
- 如果调用线程不拥有互斥量,则行为未定义。
- 不抛出异常。
- 对单个互斥量的所有锁定和解锁操作都发生在单个总顺序中,可以将其视为 原子变量的修改顺序:该顺序特定于此单个互斥量。
[编辑] 库类型
以下标准库类型满足 互斥量
[编辑] 缺陷报告
以下行为更改的缺陷报告被追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 已发布的行为 | 正确行为 |
---|---|---|---|
LWG 2309 | C++11 | lock 可能会抛出 std::system_error错误代码为 std::errc::device_or_resource_busy |
不允许 |