C++ named requirements: Mutex (since C++11)
From cppreference.net
Mutex 要求扩展了 Lockable 要求,包含了线程间同步机制。
目录 |
要求
- Lockable
- DefaultConstructible
- Destructible
- 不可复制
- 不可移动
对于类型为
Mutex
的对象
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 ( ) 具有以下特性
-
- 表现为原子操作。
- 释放调用线程对互斥锁的所有权,并与同一对象后续成功的锁定操作建立 同步关系 。
- 若调用线程未持有该互斥锁,则行为未定义。
- 不抛出异常。
- 对单个互斥锁的所有加锁和解锁操作都发生在单一全序中,该顺序可视为原子变量的 修改顺序 :此顺序特定于该独立互斥锁。
标准库
以下标准库类型满足 Mutex 要求:
|
(C++11)
|
提供基础互斥设施
(类) |
|
(C++11)
|
提供可被同一线程递归锁定的互斥设施
(类) |
|
(C++11)
|
提供可被同一线程递归锁定
并实现超时锁定功能的互斥设施 (类) |
|
(C++17)
|
提供共享互斥设施
(类) |
|
(C++14)
|
提供共享互斥设施并实现超时锁定功能
(类) |
|
(C++11)
|
提供实现超时锁定功能的互斥设施
(类) |
缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的C++标准。
| 缺陷报告 | 应用于 | 发布时的行为 | 正确行为 |
|---|---|---|---|
| LWG 2309 | C++11 |
lock
可能抛出
std::system_error
并带有错误码 std::errc::device_or_resource_busy |
不允许 |