概念说明:
std::mutex
互斥量或锁,是一个用于保护共享数据不会同时被多个线程访问的类;
互斥量或锁:
是用来保护共享资源(变量或者代码)不被并发访问的一种方法,它只是方法,实际的实现就是 std::mutex
等类;
使用说明:
1.手动操作锁:
#include <mutex>
std::mutex mutex;//必须是全局的变量
void MutexTest()
{
//在数据访问前,加锁
mutex.lock();
//do something that is thread safe...
//在数据访问后或离开作用域解锁
mutex.unlock();
}
2.利用std::lock_guard自动操作锁:
std::lock_guard 是一个互斥量的包装类,用来提供自动为互斥量上锁和解锁的功能。
#include <mutex>
std::mutex mutex;//必须是全局的变量
void MutexTest()
{
// 在数据访问前
//构造时自动加锁
std::lock_guard<std::mutex>(mutex);
//do something that is thread safe...
// 离开局部作用域,析构函数自动完成解锁功能
}
//std::lock_guard实现原理参考:
template<typename T> class _lock_guard
{
public:
// 因为在 std::mutex 的定义中,mutex禁止拷贝与赋值
// mutex(const mutex&) = delete;
// mutex& operator=(const mutex&) = delete;
// 则传递锁时需要传递引用
_lock_guard(T& mutex) :mutex_(mutex)
{
// 构造加锁
mutex_.lock();
}
~_lock_guard()
{
// 析构解锁
mutex_.unlock();
}
private:
// 不可赋值,不可拷贝
_lock_guard(_lock_guard const&);
_lock_guard& operator=(_lock_guard const&);
private:
T& mutex_;//定义锁
};