C++ 具名要求:互斥体 (Mutex) (C++11 起)
来自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
|
不允许 |