unique_lock 和 lock_guard,以及std::condition_variable 的使用

区别

unique_lock是个类模板,工作中,一般lock_guard(推荐使用);lock_guard取代了mutex的lock()和unlock();
unique_lock比lock_guard灵活很多,效率上差一点,内存占用多一点。

为什么说unique_lock更灵活?
  unique_lock可以通过unlock()和lock()主动进行解锁和获取锁的操作,而不一定需要等到相应的变量被释放才释放锁
  lock_guard 只能够通过相应变量的生命周期来控制锁的获取和释放
  
什么时候需要用到unique_lock?
  在进行多线程编程的时候,我们常常会碰到拿到锁的释放与再获取的情况,比如:
  我们将某个task分成了 1/2/3 三个部分,上和下由线程A完成, 中由线程B完成。
  那么,正常的处理flow就是, 线程A处理 task 1, 然后等待, 转线程B处理 task 2, 处理完成后,通知线程A,线程A继续处理 task 3。
  在处理整个事情的过程中,都要获取同一个锁 M, 那么在A处理了 task 1,就应该释放掉锁,然后线程B才能获取到锁M, 否则, 就出现了死锁。
  所以,这里有一个需求, 那就是这个锁可以主动释放和再获取, 也就是要用的 unique_lock
  另外还有一个需求,那就是线程B完成task的中部分之后,需要通知线程A, 这个通知怎么完成, 这个可以通过std::condition_variable 来完成。
  

  std::mutex mMutex;
  std::condition_variable     mWakeSignal;
  
  //thread A:
  {
	std::unique_lock lock(mMutex);
	//do task 1;
	//start 线程B;
	mWakeSignal.wait(lock); //释放mMutex 并进入休眠状态
	//do task 3;
  }
  
  //thread B:
  {
	std::unique_lock lock(mMutex);
	//do task 2;
	mWakeSignal.notify_all();//此时唤醒线程A。
  }
  


  

你可能感兴趣的:(c++)