boost::unique_lock/boost::shared_lock

一、lock模板类

1、独占锁:
boost::unique_lock<T>,其中T可以mutex中的任意一种。
2、共享锁:
boost::shared_lock<T>,其中的T只能是shared_mutex类。
二、读写锁
typedef boost::shared_lock<boost::shared_mutex> readLock;//读锁,被锁后仍允许其他线程执行同样被shared_lock的代码。
typedef boost::unique_lock<boost::shared_mutex> writeLock;//写锁,被锁后不允许其他线程执行被shared_lock或unique_lock的代码。
三、独占锁
lock_guard 独占锁,自定加锁解锁,类似于智能指针。
boost::mutex mutex;  
boost::lock_guard<boost::mutex> lock(mutex);

unique_lock 独占锁,自定加锁解锁,类似于智能指针。
boost::mutex mutex;  
boost::unique_lock<boost::mutex> lock(mutex);  
四、延迟锁定(defer_lock)
{
     boost::unique_lock<boost::shared_mutex> lock(mtx, boost::defer_lock);
     // 此时未加锁

    // 做一些其他工作...
    std::cout << "准备写入数据..." << std::endl;

    lock.lock(); // 手动加锁
    shared_counter = 100;
    // 自动解锁(析构)
}
五、条件变量配合使用(经典模式)
boost::mutex data_mutex;
boost::condition_variable cond;

bool data_ready = false;

void producer() {
    boost::this_thread::sleep_for(boost::chrono::seconds(1));
    
    boost::unique_lock<boost::mutex> lock(data_mutex);
    data_ready = true;
    std::cout << "数据已生成" << std::endl;
    cond.notify_one(); // 通知等待的线程
}

void consumer() {
    boost::unique_lock<boost::mutex> lock(data_mutex);
    std::cout << "等待数据..." << std::endl;
    
    // 等待条件满足
    cond.wait(lock, []{ return data_ready; });
    
    std::cout << "消费者收到数据,开始处理" << std::endl;
}
posted @ 2021-03-09 22:00  osbreak  阅读(301)  评论(0)    收藏  举报