目录

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);
    }
};

或者使用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();
}