C++ 命名要求: 互斥体 (Mutex) (C++11 起)
互斥体 (Mutex) 要求扩展了 Lockable 要求,以包含线程间同步。
要求
- Lockable
- DefaultConstructible
- Destructible
- 不可拷贝 (not copyable)
- 不可移动 (not movable)
对于 互斥体 (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++ 标准。
DR | 应用于 | 发布时的行为 | 正确行为 |
---|---|---|---|
LWG 2309 | C++11 | lock 可能会抛出带有错误代码 std::errc::device_or_resource_busy 的 std::system_error | 不允许 |