命名空间
变体
操作

C++ 命名要求: 互斥量 (自 C++11 起)

来自 cppreference.com
 
 
C++ 命名要求
 

互斥量 要求扩展了 可锁定 要求,包括线程间同步。

内容

[编辑] 要求

对于 互斥量 类型的对象 m

  • 表达式 m.lock() 具有以下属性
  • 表现为原子操作。
  • 阻塞调用线程,直到获得互斥量的独占所有权。
  • 先前的 m.unlock() 操作在同一互斥量上与该锁定操作同步(等效于发布-获取 std::memory_order)。
  • 如果调用线程已经拥有互斥量,则行为未定义(除非 m 是 std::recursive_mutexstd::recursive_timed_mutex)。
  • 类型为 std::system_error 的异常可能会在错误时抛出,错误代码如下
  • 表达式 m.try_lock() 具有以下属性
  • 表现为原子操作。
  • 尝试在不阻塞的情况下为调用线程获取互斥量的独占所有权。如果未获得所有权,则立即返回。即使互斥量当前未被其他线程拥有,该函数也可能虚假失败并返回。
  • 如果 try_lock() 成功,则先前的 unlock() 操作在同一对象上与该操作同步(等效于发布-获取 std::memory_order)。lock() 与失败的 try_lock() 不同步。
  • 不抛出异常。
  • 表达式 m.unlock() 具有以下属性
  • 表现为原子操作。
  • 释放调用线程对互斥量的所有权,并与后续对同一对象的成功锁定操作同步
  • 如果调用线程不拥有互斥量,则行为未定义。
  • 不抛出异常。
  • 对单个互斥量的所有锁定和解锁操作都发生在单个总顺序中,可以将其视为 原子变量的修改顺序:该顺序特定于此单个互斥量。

[编辑] 库类型

以下标准库类型满足 互斥量

[编辑] 缺陷报告

以下行为更改的缺陷报告被追溯应用于先前发布的 C++ 标准。

DR 应用于 已发布的行为 正确行为
LWG 2309 C++11 lock 可能会抛出 std::system_error
错误代码为 std::errc::device_or_resource_busy
不允许

[编辑] 另请参阅