目录
2. 使用 lock_guard/unique_lock 自动加锁、解锁。类似智能指针
一、lock_guard<mutex> lock()
多线程访问同一资源时,为了保证数据的一致性,必要时需要加锁mutex。
1. 直接操作mutex的lock/unlock函数
#include <iostream>
#include <boost>
std::mutex m_buf;
void Counter(){
m_buf.lock();
int i=++count;// 只有当一个线程输出完毕了,另一个线程才能输出
m_buf.unlock();
}
int main(){
boost::thread_group threads;// 创建进程
for(int i=0;i<4;i++)
threads.create_thread(&Counter);
threads.join_all();
return 0;
}
2. 使用 lock_guard/unique_lock 自动加锁、解锁。类似智能指针
与上面相比只需要加锁,后面无须解锁unlock().
unique_lock<mutex> lck(m);就是创建了一个unique_lock对象lck,并将其与互斥量m绑定,同时对其上锁。
#include <iostream>
#include <boost/thread/lock_guard.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/thread.hpp>
boost::mutex mutex;
int count = 0;
void Counter() {
// lock_guard 在构造函数里加锁,在析构函数里解锁。
boost::lock_guard<boost::mutex> lock(mutex);
int i = ++count;
std::cout << "count == " << i << std::endl;
}
int main() {
boost::thread_group threads;
for (int i = 0; i < 4; ++i) {
threads.create_thread(&Counter);
}
threads.join_all();
return 0;
}
3、unique_lock和lock_guard区别:
- unique_lock不需要始终拥有关联的mutex</