问题来源:leetcode简单题1114按序打印
mutex
mutex又称互斥量,用于提供对共享变量的互斥访问。mutex包含于头文件#include <mutex>
中
序号 | 名称 | 用途 |
---|---|---|
1 | mutex | 最基本也是最常用的互斥类 |
2 | recursive_mutex | 同一线程内可递归(重入)的互斥类 |
3 | timed_mutex | 除具备mutex功能外,还提供了带时限请求锁定的能力 |
4 | recursive_timed_mutex | 同一线程内可递归(重入)的timed_mutex |
操作
lock
锁住互斥量。调用lock时有三种情况:
- 如果互斥量没有被锁住,则调用线程将该mutex锁住,直到调用线程调用unlock释放。
- 如果mutex已被其它线程lock,则调用线程将被阻塞,直到其它线程unlock该mutex。
- 如果当前mutex已经被调用者线程锁住,则std::mutex死锁,而recursive系列则成功返回。
try_lock
尝试锁住mutex,调用该函数同样也有三种情况:
- 如果互斥量没有被锁住,则调用线程将该mutex锁住(返回true),直到调用线程调用unlock释放。
- 如果mutex已被其它线程lock,则调用线程将失败,并返回false。
- 如果当前mutex已经被调用者线程锁住,则std::mutex死锁,而recursive系列则成功返回true。
unlock
解锁mutex,释放对mutex的所有权。值得一提的时,对于recursive系列mutex,unlock次数需要与lock次数相同才可以完全解锁。
try_lock_for, try_lock_until
这两个函数仅用于timed系列的mutex(std::timed_mutex, std::recursive_timed_mutex),函数最多会等待指定的时间,如果仍未获得锁,则返回false。除超时设定外,这两个函数与try_lock行为一致。
lock_guard
lock_guard利用了C++ RAII的特性,在构造函数中上锁,析构函数中解锁。
unique_lock
ock_guard提供了简单上锁、解锁操作,但当我们需要更灵活的操作时便无能为力了。这些就需要unique_lock上场了。unique_lock拥有对Mutex的所有权,一但初始化了unique_lock,其就接管了该mutex, 在unique_lock结束生命周期前(析构前),其它地方就不要再直接使用该mutex了。
try_lock
当有多个mutex需要执行try_lock时,该函数提供了简便的操作。try_lock会按参数从左到右的顺序,对mutex顺次执行try_lock操作。当其中某个mutex.try_lock失败(返回false或抛出异常)时,已成功锁定的mutex都将被解锁。
需要注意的是,该函数成功时返回-1, 否则返回失败mutex的索引,索引从0开始计数。