zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C++之lock_guard和unique_lock自动加解锁区别(九十三)

C++自动 区别 解锁 lock unique Guard
2023-09-14 09:09:57 时间

 1.如何使用

一、std::unique_lock也可以提供自动加锁、解锁功能,比std::lock_guard更加灵活。


1.std::lock_guard
std::lock_guard是RAII模板类的简单实现,功能简单。
1.std::lock_guard 在构造函数中进行加锁,析构函数中进行解锁。
2.锁在多线程编程中,使用较多,因此c++11提供了lock_guard模板类;在实际编程中,我们也可以根据自己的场景编写resource_guard RAII类,避免忘掉释放资源。


2.std::unique_lock
类 unique_lock 是通用互斥包装器,允许延迟锁定、锁定的有时限尝试、递归锁定、所有权转移和与条件变量一同使用。
unique_lock比lock_guard使用更加灵活,功能更加强大。
使用unique_lock需要付出更多的时间、性能成本。

2.代码示例  

二、demo
# emacs test.cpp
// unique_lock example
#include <iostream>
#include <thread>
#include <mutex>
#include <sys/time.h>

std::mutex mtx;
struct timeval tv;
unsigned long us_start,us_end;

void print_block (int n, char c) {
	//start time
	gettimeofday(&tv,NULL);
	us_start = tv.tv_sec*1000000 + tv.tv_usec; //us

	//1.unique_lock加锁,没有mutex所有的权限,(根据mutex的属性来判断是否能够加锁, 自动加锁自动解锁), 时间上比lock_guard慢
  std::unique_lock<std::mutex> lck (mtx);//如果不加锁,线程打印为乱序.
	//lck.unlock();//不用调用,自动加锁自动解锁.
	
	//2.锁定的向导拥有mutex所有的权限,自动加锁自动解锁(浪费时间) 一旦读取失败,就一直等待
	//std::lock_guard<std::mutex>lck (mtx);
  for (int i=0; i<n; ++i) { std::cout << c; }
  std::cout << '\n';	

	//end time
	gettimeofday(&tv,NULL);
	us_end = tv.tv_sec*1000000 + tv.tv_usec; //us
	printf("us_delta = %ld us\n",us_end - us_start);
}

int main (){
  std::thread th1 (print_block,100,'*');
  std::thread th2 (print_block,100,'$');

  th1.join();
  th2.join();
  //std::cin.get();
  return 0;
}