四川网站建设找哪家,人们常说的蓝领是从事什么工作的,潍坊的网站建设,wordpress重定向seo1.std::lock_guard
std::lock_guard其实就是简单的RAII#xff08;Resource Acquisition Is Initialization#xff09;封装#xff0c;资源获取即初始化。在构造函数中进行加锁#xff0c;析构函数中进行解锁#xff0c;这样可以保证函数退出时#xff0c;锁一定被释放…1.std::lock_guard
std::lock_guard其实就是简单的RAIIResource Acquisition Is Initialization封装资源获取即初始化。在构造函数中进行加锁析构函数中进行解锁这样可以保证函数退出时锁一定被释放。
不可以对 std::lock_guard 调用 unlock 进行解锁操作。std::lock_guard 是一个非常简单的互斥量管理类设计初衷是提供一种 RAII资源获取即初始化风格的锁机制当 std::lock_guard 对象创建时锁定互斥量并在对象销毁时析构函数里自动解锁互斥量。std::lock_guard 没有提供解锁和重新锁定的功能。它的接口非常简单只包含构造函数和析构函数没有 unlock 或 lock 方法。这使得 std::lock_guard 更加轻量级但也更不灵活。
构造函数
explicit lock_guard(mutex_type m); // 引用类型锁定互斥量m析构函数中解锁// 其中mutex_type是模板参数的别名
template class Mutex
class lock_guard {
public:using mutex_type Mutex; // 定义 mutex_type 为模板参数 Mutexexplicit lock_guard(mutex_type m);~lock_guard();// ...
};
2.std::unique_lock
转自https://www.cnblogs.com/moodlxs/p/10111843.html
std::lock_guard的功能超集 封装了各种加锁操作阻塞的非阻塞的还可以结合条件变量一起使用基本上对锁的各种操作都封装了。所以性能和内存开销都比std::lock_guard大得多需要有选择地使用。 std::unique_lock也会在析构的时候自动解锁所以说是std::lock_guard的功能超集。
支持多种加锁模式构造函数
unique_lock() noexcept; // 默认构造函数创建一个不与任何互斥量相关联的 unique_lock 对象
explicit unique_lock(mutex_type m); //创建一个与互斥量 m 相关联并立即锁定它的 unique_lock 对象通过析构函数unlock
unique_lock( mutex_type m, std::defer_lock_t t ); //延迟加锁之后再调用lock()主动加锁可以不用unlock可以通过unique_lock的析构函数unlock
unique_lock( mutex_type m, std::try_to_lock_t t ); //尝试加锁
unique_lock( mutex_type m, std::adopt_lock_t t ); //马上加锁
unique_lock(unique_lock u) noexcept; // 移动构造函数。原来的 unique_lock 对象将不再持有互斥量。
尝试加锁例子
std::mutex mlock;void work1(int s) {for (int i 1; i 5000; i) {std::unique_lockstd::mutex munique(mlock, std::try_to_lock);if (munique.owns_lock() true) {// 判断是否加锁成功s i;}else {// 执行一些没有共享内存的代码}}
}
延迟加锁例子
void work1(int s) {for (int i 1; i 5000; i) {std::unique_lockstd::mutex munique(mlock, std::defer_lock);if (munique.try_lock() true) {// 判断当前是否能locks i;}else {// 处理一些没有共享内存的代码}}
}
移动构造函数例子
std::unique_lockstd::mutex munique1(mlock);
std::unique_lockstd::mutex munique2(std::move(munique1));
// 此时munique1失去mlock的权限并指向空值munique2获取mlock的权限