目录
unique_lock比lock_guard更加灵活
unique_lock 和 lock_guard 都是 C++11 中的互斥量封装类,用于保护共享资源的访问。它们的主要区别在于灵活性和性能。
lock_guard 是一个简单的互斥量封装类,它在构造时自动锁定互斥量,在析构时自动释放互斥量。由于 lock_guard 的生命周期与作用域一致,因此它适用于需要在作用域内保护共享资源的情况。由于 lock_guard 的实现比较简单,因此它的性能比 unique_lock 更好。
unique_lock 是一个更灵活的互斥量封装类,它可以手动锁定和释放互斥量,并且支持多个线程之间的所有权转移。由于 unique_lock 的灵活性,它适用于需要在不同的作用域中保护共享资源的情况,或者需要在多个线程之间传递互斥量所有权的情况。由于 unique_lock 的实现比较复杂,因此它的性能比 lock_guard 差一些。
std::unique_lock对象可以不占有关联的互斥。
下面是,
class some_bi_obj;
void swap(some_bi_obj& lhs, some_bi_obj& rhs);
class X {
private:
some_bi_obj some_details;
std::mutex m;
public:
X(some_bi_obj const& sd) : some_details(sd) {}
friend void swap(X& lhs, X& rhs) {
if (&lhs == &rhs) return;
// 将互斥保留为无锁状态
std::unique_lock<std::mutex> lock_a(lhs.m, std::defer_lock);
std::unique_lock<std::mutex> lock_b(rhs.m, std::defer_lock);
// unique_lock可以传给lock函数
std::lock(lhs.m, rhs.m); // 锁定两个互斥
swap(lhs.some_details, rhs.some_details);
}
};
class some_bi_obj;
void swap(some_bi_obj& lhs, some_bi_obj& rhs);
class X {
private:
some_bi_obj some_details;
std::mutex m;
public:
X(some_bi_obj const& sd) : some_details(sd) {}
friend void swap(X& lhs, X& rhs) {
if (&lhs == &rhs) return;
// 将互斥保留为无锁状态
std::unique_lock<std::mutex> lock_a(lhs.m, std::defer_lock);
std::unique_lock<std::mutex> lock_b(rhs.m, std::defer_lock);
// unique_lock可以传给lock函数
std::lock(lhs.m, rhs.m); // 锁定两个互斥
swap(lhs.some_details, rhs.some_details);
}
};
或者使用scope_lock也可以
按照合适粒度加锁
假如代码不需要再访问共享数,就调用unlock解锁;若以后需要重新访问,则调用lock加锁
void get_and_process_data() { std::unique_lock<std::mutex> my_lock(the_mutex); do_sth(); my_lock.unlock(); do_sth(); my_lock.lock(); do_sth(); }
No comments yet.