std::mutex类、std::lock_guard类、std::unique_lock类:这三个类共同实现了STL中的RAII(Resource Acquisition Is Initialization)模式,用于确保在进入临界区之前获取互斥锁,并在退出临界区之后自动释放互斥锁。其中std::lock_guard类是基于std::mutex类的RAII封装,而std::unique_lock类提供了更高级的互斥锁控制接口。
其实这种做法有个专有的名称,叫做RAII #include <iostream>#include<boost/thread/lock_guard.hpp>#include<boost/thread/mutex.hpp>#include<boost/thread/thread.hpp>boost::mutex mutex;intcount =0;voidCounter() {//lock_guard 在构造函数里加锁,在析构函数里解锁。boost::lock_guard<boost::mutex>lock(mu...
std::lock_guard:RAII(Resource Acquisition Is Initialization)风格的包裹器,确保锁在作用域中被安全地获取和释放。 std::unique_lock:比std::lock_guard更灵活,允许延迟锁定、时间锁定、重复锁定和解锁以及转移锁所有权等。 std::shared_mutex(C++17引入):读写锁,支持多个读者(共享锁)或单一写者(独占锁)。 3...
1、Class lock_guard 最简单的锁形式就是Mutex.Lock(),这个方法简单好用,但是有很多时候,人们会忘记将其解锁(Mutex.unlock()),所以出现了lock_guard的这种自动解锁的方法。Class lock_guard是在声明时,自动上锁,在离开作用域之后自动析构解锁。 我们看一下接口: #include<iostream>#include<thread>#include<mutex...
在一个函数中使用std::lock_guard来保护临界区。当lock_guard对象被销毁时,它会自动释放锁,即使函数因为异常而提前退出。 RAII原则在C++中非常重要,它通过自动管理资源的生命周期,减轻了程序员的负担,同时提高了代码的可维护性和安全性。
unique_lock和lock_guard都是C++中用于管理互斥量的RAII(资源获取即初始化)类。它们的主要区别如下: 所有权:unique_lock允许在其生命周期内多次锁定和解锁互斥量,而lock_guard只允许一次性地锁定和解锁互斥量。因此,unique_lock提供了更大的灵活性,在需要多次锁定和解锁的情况下更为方便。
LockGuard.hpp Mutex 类中封装了外部传入的锁,其 Lock 接口是对传入的锁进行加锁,Unlock 接口是对传入的锁进行解锁。lockGuard 类是以 RAII 的思想来设计了一个锁的守卫的类,该类对象进行构造时会自动进行加锁,进析构时会自动进行解锁,不需要手动进行加锁和解锁,只需要创建 lockGuard 类对象即可。
lock(); } ~LockGuard() { mutex_.unlock(); } private: Mutex mutex_; }; 线程池代码如下:创建一批线程时,我们需要实现线程的运行函数static void*handlerTask,之所以是静态的,是因为我们要把这个运行函数传递给Thread类中的func_,不能有this指针,所以是静态成员函数。而没有this指针,我们无法访问ThreadPool...
获得std::mutex (典型地通过 std::lock_guard ) 在保有锁时进行修改 在std::condition_variable 上执行 notify_one 或 notify_all (不需要为通知操作保有锁) 等待线程: 获得std::unique_lockstd::mutex,在与用于保护共享变量者相同的互斥上 执行wait 、 wait_for 或 wait_until ,等待操作自动释放上一步中...
lock_guard只能在对象生命周期结束时自动释放锁。 unique_lock可以在任意位置释放锁。 如果使用了lock_guard的话就无法在进入等待队列的时候释放锁了。 wait_for和wait_until都是等待指定时间,一个是在等待队列中待指定时间,另一个是在等待队列中带到固定的时间点后自定唤醒。