多线程与锁

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();
}

 

posted @ 2021-11-05 13:56  chenjian688  阅读(124)  评论(0编辑  收藏  举报