互斥
互斥算法避免多个线程同时访问共享资源。这会避免数据竞争,并提供线程间的同步支持。
mutex
// 在标头<mutex>定义
class mutex; // (C++11起)
mutex类是能用于保护共享数据避免受从多个线程同时访问的同步原语。
mutex提供排他性非递归所有权语义:
- 调用方线程从它成功调用lock或try_lock开始,到它调用unlock为止占有mutex。
- 线程占有mutex时,所有其他线程若试图要求mutex的所有权,则将阻塞或收到false返回值
- 调用方线程在调用lock或try_lock前必须不占有mutex。
若mutex在仍为任何线程所占有时即被销毁,或在占有mutex时线程终止,则行为未定义。
mutex即不可复制亦不可移动。
成员函数
函数 | 功能 |
---|---|
mutex() | 构成互斥 |
~mutex() | 析构函数 |
operator=() = delete; | 不可复制赋值 |
锁定 | |
lock | 锁定互斥,若互斥不可用则阻塞 |
try_lock | 尝试锁定互斥,若互斥不可用则返回 |
unlock | 解锁互斥 |
lock_guard
// 在标头<mutex>定义
template <class Mutex> class lock_guard;
类lock_guard是互斥体包装器,为在作用域块期间占有互斥提供便利RAII风格机制。
创建lock_guard对象时,它试图接收给定互斥的所有权。控制离开创建lock_guard对象的作用域时,销毁lock_guard并释放互斥。lock_guard类不可复制。
成员函数
函数 | 功能 |
---|---|
构造函数 | 构造lock_guard,可选地锁定给定的互斥 |
析构函数 | 析构lock_gurad,解锁底层互斥 |
operator=() = delete; | 不可复制赋值 |
unique_lock
// 在标头<mutex>定义
template <class Mutex> class unique_lock;
类unique_lock是通用互斥包装器,允许延迟锁定、锁定的有时限尝试、递归锁定、所有权转移和与条件变量一同使用。
类unique_lock可移动,但不可复制—它满足可移动构造和可移动赋值但不满足可复制构造或可复制赋值。
类unique_lock满足基本可锁定要求。
成员函数
函数 | 功能 |
---|---|
构造函数 | 构造unqiue_lock,可选地锁定给定的互斥 |
析构函数 | 析构unqiue_lock,解锁底层互斥 |
operator=(&&) | 移动复制赋值,若占有则解锁互斥,并取得另一者的所有权 |
锁定 | |
lock | 锁定关联互斥 |
try_lock | 尝试锁定关联互斥,若互斥不可用则返回 |
try_lock_for | 尝试锁定关联的可定时锁定互斥,若互斥在给定时长中不可用则返回 |
try_lock_until | 尝试锁定关联可定时锁定互斥,若抵达指定时间互斥仍不可用则返回 |
unlock | 解锁关联互斥 |