多线程与锁
1、std::lock_guard
这个类是一个互斥量的包装类,用来提供自动为互斥量上锁和解锁的功能,简化了多线程编程,用法如下:
#include <mutex>
std::mutex kMutex;
void function() {
// 构造时自动加锁
std::lock_guard<std::mutex> lock(kMutex); //如果kMutex已被上锁,线程会阻塞在此处
// 离开{}局部作用域,析构函数自动完成解锁功能
}
/*std::lock_guard严格基于作用域(scope-based)的锁管理类模板,
构造时是否加锁是可选的(不加锁时假定当前线程已经获得锁的所有权),析构时自动释放锁,所有权不可转移,对象生存期内不允许手动加锁和释放锁。
默认构造函数里锁定互斥量,即调用互斥量的lock函数。析构函数里解锁互斥量,即调用互斥量的unlock函数。
std::lock_guard 对象并不负责管理 Mutex 对象的生命周期,lock_guard 只是简化了 Mutex 对象的上锁和解锁操作,方便线程对互斥量上锁,
即在某个 lock_guard对象的声明周期内,它所管理的锁对象会一直保持上锁状态;而 lock_guard的生命周期结束之后,它所管理的锁对象会被解锁。
*/
std::lock(mtA, mtB);
std::lock_guard<std::mutex>lock1(mtA, std::adopt_lock); //此时表明当前线程已对mtA加锁,此处不上锁,仅用来自动释放锁
std::unique_lock<std::mutex>lock1(mtA, std::defer_lock);
std::unique_lock<std::mutex>lock2(mtB, std::defer_lock);
std::lock(lock1, lock2);
//参数为 std::defer_lock,表明不lock锁,在执行功能代码之前再统一lock掉两个unique_lock,在 unique_lock 的生命周期结束之后,mt对象自动解锁。
2、std::mutex
#include <mutex>
std::mutex kMutex;
void function() {
//加锁
kMutex.lock();
//kMutex.try_lock();
//do something that is thread safe...
//需要手动解锁
kMutex.unlock();
}