一、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;
}