C++ 具名要求:互斥体 (Mutex)
来自cppreference.com
互斥体 (Mutex) 要求扩展可锁定 (Lockable) 要求以包含线程间同步。
要求
对于互斥 (互斥体 (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++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 2309 | C++11 | lock 可以抛出错误码为 std::errc::device_or_resource_busy 的 std::system_error
|
不允许 |