IE盒子

搜索
查看: 132|回复: 0

c++ 关于共享锁(std::shared_mutex)的简单使用

[复制链接]

3

主题

7

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2023-1-5 17:42:58 | 显示全部楼层 |阅读模式
介绍:
C++14中引入std::shared_mutex,用于管理可转移和共享所有权的互斥对象,适合多个线程读取共享资源,且仅一个线程来写这个资源,共享锁这个时候具有性能优势。
用法:使用std::unique_lock(通用互斥包装器)与std::shared_lock(通用共享互斥所有权包装器)管理共享锁定,因为包装器离开作用域析构时会自动释放锁,因此不会造成死锁问题,使用简单明了。

它具有两个访问权限属性:

  • 共享性-读属性,多个线程同时共享锁的所有权,需要引入#include <shared_mutex>;
  • 独占性-写属性,同一时刻仅一个线程具有所有权的互斥性,需要引入#include <mutex>;
若一个线程已经获得了独占锁,这时其他线程将不能获取该锁(含共享锁)。

示意图:


示例代码片段:
#include <iostream>
#include <mutex>
#include <shared_mutex>
std::shared_mutex test_lock;
int ivalue=0;
void read_fun1(){
// shared_lock共享锁
std::shared_lock<std::shared_mutex> lock(test_lock);
/***do something***/
std::cout << __func__ << ivalue << std::endl;
}
void read_fun2(){
// shared_lock共享锁
std::shared_lock<std::shared_mutex> lock(test_lock);
/***do something***/
std::cout << __func__ << ivalue << std::endl;
}
void write_fun(){
// unique_lock独占锁
std::unique_lock<std::shared_mutex> lock(test_lock);
/***do something***/
ivalue++;
}
当函数read_fun1和read_fun2可以同时进行读取输出ivalue的值,并且write_fun里的锁将阻塞;
当write_fun获得时候锁时候,read_fun1和read_fun2会阻塞;
函数read_fun1、read_fun2、write_fun在执行完后锁会自动释放;

本文由慧拓技术研究院成员分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表