C++ 命名要求: 互斥量 (自 C++11 起)
来自 cppreference.cn
互斥量 要求扩展了 Lockable 要求,以包含线程间同步。
目录 |
[编辑] 要求
- Lockable
- DefaultConstructible
- Destructible
- 不可复制
- 不可移动
对于 Mutex 类型的对象 m
- 表达式 m.lock() 具有以下属性
- 行为如同原子操作。
- 阻塞调用线程,直到可以获得互斥量的独占所有权。
- 在同一互斥量上先前的 m.unlock() 操作与此 lock 操作同步发生(等效于 release-acquire 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()
操作与此操作同步发生(等效于 release-acquire std::memory_order)。lock()
不与失败的try_lock()
同步。 - 不抛出异常。
- 表达式 m.unlock() 具有以下属性
- 行为如同原子操作。
- 释放调用线程对互斥量的所有权,并与同一对象上后续成功的 lock 操作同步发生。
- 如果调用线程不拥有互斥量,则行为未定义。
- 不抛出异常。
- 对单个互斥量的所有 lock 和 unlock 操作都以单个总顺序发生,该顺序可以被视为原子变量的修改顺序:该顺序特定于此单个互斥量。
[编辑] 标准库
以下标准库类型满足 Mutex 要求
(C++11) |
提供基本互斥设施 (类) |
(C++11) |
提供可由同一线程递归锁定的互斥设施 (类) |
(C++11) |
提供可递归锁定的互斥设施 由同一线程,并实现带超时的锁定 (类) |
(C++17) |
提供共享互斥设施 (类) |
(C++14) |
提供共享互斥设施,并实现带超时的锁定 (类) |
(C++11) |
提供实现带超时的锁定的互斥设施 (类) |
[编辑] 缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 已发布行为 | 正确行为 |
---|---|---|---|
LWG 2309 | C++11 | lock 可能会抛出 std::system_error带有错误代码 std::errc::device_or_resource_busy |
不允许 |