C++11新特性之互斥锁包装器

 

lock_guard管理类

#include <mutex>

template< class Mutex >
class lock_guard;

类 lock_guard 是互斥体包装器,为在作用域块期间占有互斥提供便利 RAII 风格机制。

创建 lock_guard 对象时,它试图接收给定互斥的所有权。控制离开创建 lock_guard 对象的作用域时,销毁 lock_guard 并释放互斥。

lock_guard 类不可复制。

模板形参

Mutex - 要锁定的互斥。

成员类型

成员类型 定义
mutex_type Mutex

构造函数

构造新的 mutex 对象。

explicit lock_guard( mutex_type& m );

lock_guard( mutex_type& m, std::adopt_lock_t t );

lock_guard( const lock_guard& ) = delete;

获得给定互斥 m 的所有权。

  1. 等效地调用 m.lock() 。
  2. 获得互斥 m 的所有权而不试图锁定它。若当前线程不在 m 上保有非共享锁(即由 lock、 try_lock、 try_lock_for 或 try_lock_until 取得的锁)则行为未定义。
  3. 复制构造函数被删除。 若在 m 先于 lock_guard 对象被销毁,则行为未定义。
  • 参数 m - 要获得所有权的共享互斥 t - 用于选择构造函数非锁定版本的标签参数

析构函数

销毁 lock_guard 对象。

~lock_guard();

释放所占有互斥的所有权。

等效地调用 m.unlock() ,其中 m 是传递个 lock_guard 的构造函数的互斥。

复制函数(删除)

unique_lock管理类

#include <mutex>

template< class Mutex >
class unique_lock;

类 unique_lock 是通用互斥包装器,允许延迟锁定、锁定的有时限尝试、递归锁定、所有权转移和与条件变量一同使用。

类 unique_lock 可移动,但不可复制——它满足可移动构造 和可移动赋值 但不满足可复制构造 或可复制赋值 。

类 unique_lock 满足基本可锁定 要求。若 Mutex 满足可锁定要求,则 unique_lock 亦满足可锁定要求(例如:能用于 std::lock ) ;若 Mutex 满足可定时锁定要求,则 unique_lock 亦满足可定时锁定要求。

模板形参

Mutex - 要锁定的互斥。

成员类型

成员类型 定义
mutex_type Mutex

构造函数

构造新的 mutex 对象。

unique_lock() noexcept;

unique_lock( unique_lock&& other ) noexcept;

explicit unique_lock( mutex_type& m );

unique_lock( mutex_type& m, std::defer_lock_t t ) noexcept;

unique_lock( mutex_type& m, std::try_to_lock_t t );

unique_lock( mutex_type& m, std::adopt_lock_t t );

template< class Rep, class Period >
unique_lock( mutex_type& m,
    const std::chrono::duration<Rep,Period>& timeout_duration );

template< class Clock, class Duration >
unique_lock( mutex_type& m,
    const std::chrono::time_point<Clock,Duration>& timeout_time );

构造 unique_lock ,可选地锁定提供的互斥。

  1. 构造无关联互斥的 unique_lock 。
  2. 移动构造函数。以 other 的内容初始化 unique_lock 。令 other 无关联互斥。 3-8. 构造以 m 为关联互斥的 unique_lock 。另外:
  3. 通过调用 m.lock() 锁定关联互斥。
  4. 不锁定关联互斥。
  5. 通过调用 m.try_lock() 尝试锁定关联互斥而不阻塞。若 Mutex 不满足可锁定 (Lockable) 则行为未定义。
  6. 假定调用方线程已保有 m 上的非共享锁(即由 lock、 try_lock、 try_lock_for 或 try_lock_until 取得的锁)。若非如此则行为未定义。
  7. 通过调用 m.try_lock_for(timeout_duration) 尝试锁定关联互斥。阻塞到经过指定的 timeout_duration 或获得锁这两个事件的先到来者为止。可能阻塞长于 timeout_duration 。若 Mutex 不满足可定时锁定 (TimedLockable) 则行为未定义。
  8. 通过调用 m.try_lock_until(timeout_time) 尝试锁定关联互斥。阻塞到抵达指定的 timeout_time 或获得锁这两个事件的先到来者为止。可能阻塞长于抵达 timeout_time 。若 Mutex 不满足可定时锁定 (TimedLockable) 则行为未定义。
  • 参数 other - 用以初始化状态的另一 unique_lock m - 与锁关联且可选的获得所有权的互斥 t - 用于选择拥有不同锁定策略的构造函数的标签参数 timeout_duration - 要阻塞的最大时长 timeout_time - 要阻塞到的最大时间点

析构函数

销毁 lock_guard 对象。

~lock_guard();

释放所占有互斥的所有权。

等效地调用 m.unlock() ,其中 m 是传递个 lock_guard 的构造函数的互斥。

复制函数(删除)