std::shared_mutex 举例

std::shared_mutex 是 C++17 引入的一个类型,它允许多个线程同时获取共享锁(shared lock),但只允许一个线程独占锁(exclusive lock)。这样,多个线程可以并发地读取共享数据,但在写入数据时,只有一个线程能够独占访问,以保证数据的一致性。

下面是一个使用 std::shared_mutex 的例子:

#include <iostream>
#include <thread>
#include <vector>
#include <shared_mutex>
#include <chrono>class SharedCounter {
public:SharedCounter() : count(0) {}// 读取计数器的值int get_count() const {std::shared_lock<std::shared_mutex> lock(mutex_); // 获取共享锁return count;}// 增加计数器的值void increment() {std::unique_lock<std::shared_mutex> lock(mutex_); // 获取独占锁++count;std::cout << "Counter incremented to " << count << " by thread " << std::this_thread::get_id() << std::endl;}// 重置计数器的值void reset() {std::unique_lock<std::shared_mutex> lock(mutex_); // 获取独占锁count = 0;std::cout << "Counter reset to 0 by thread " << std::this_thread::get_id() << std::endl;}private:mutable std::shared_mutex mutex_; // 使用可变的共享互斥量int count;
};// 线程函数,用于增加计数器的值
void increment_counter(SharedCounter& counter, int num_increments) {for (int i = 0; i < num_increments; ++i) {counter.increment();std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 暂停一段时间,模拟实际工作}
}int main() {SharedCounter counter;// 创建多个线程来增加计数器的值std::vector<std::thread> threads;for (int i = 0; i < 5; ++i) {threads.emplace_back(increment_counter, std::ref(counter), 10);}// 等待所有线程完成for (auto& thread : threads) {thread.join();}// 输出最终计数器的值std::cout << "Final counter value: " << counter.get_count() << std::endl;// 重置计数器的值counter.reset();return 0;
}

在这个例子中,SharedCounter 类有一个 std::shared_mutex 类型的成员 mutex_,用来保护 count 成员变量。increment 和 reset 成员函数使用 std::unique_lock 来获取独占锁,确保在修改 count 时没有其他线程可以访问它。而 get_count 成员函数使用 std::shared_lock 来获取共享锁,允许多个线程同时读取 count 的值。

注意,increment 和 reset 成员函数使用独占锁,是因为这些操作会修改 count 的值,需要保证原子性和数据一致性。而 get_count 成员函数使用共享锁,是因为它只读取 count 的值,不会修改它,因此允许多个线程并发读取。

这个例子展示了 std::shared_mutex 的基本用法,你可以根据实际需求调整线程的数量、操作次数等。同时,请确保理解共享锁和独占锁之间的区别,以及它们如何影响资源的并发访问。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/29538.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql5.7安装教程(详细图解教程)_mysql5.7下载

本文讲解的是mysql5.7安装包、mysql5.7下载、mysql5.7安装配置教程、离线安装mysql5.7。MySQL 5.7 是 MySQL 数据库的一个重要版本&#xff0c;它引入了许多新特性和改进&#xff0c;旨在提高性能、安全性和易用性。 MySQL 5.7 在所有负载模型上都有显著的性能改进&#xff0c…

简述一下你对html语义化的理解

HTML语义化是指使用HTML标签来明确表示网页内容的含义和结构&#xff0c;而不是仅仅使用它们来呈现样式或布局。以下是关于HTML语义化的分点概述&#xff1a; 增强可读性&#xff1a; 语义化的HTML代码更易于阅读和理解&#xff0c;因为标签的选择反映了内容的意义。这不仅方便…

头歌资源库(10)拼数字

一、 问题描述 二、算法思想 初始化一个长度为10的数组count&#xff0c;用于记录卡片中每个数字的数量。 从1开始依次尝试拼出正整数&#xff0c;直到无法拼出下一个数为止。 对于每个尝试拼出的正整数&#xff0c;遍历其每一位的数字&#xff0c;检查该数字在count中是否还…

中国电力年鉴(2004-2023年)

数据年限&#xff1a;2004-2023 数据格式&#xff1a;pdf、excel 数据内容&#xff1a;电力年鉴收录了我国电力行业年度统计数据&#xff0c;是较为全面反映我国电力企业生产运行情况的统计资料书。以2023年为例&#xff0c;全书共分为五个部分&#xff1a;第一部分为基本数据&…

嵌入式中间件_2.嵌入式中间件的分类

1.中间件的分类 中间件的范围十分广泛&#xff0c;针对不同的应用需求涌现出了多种各具特色的中间件产品。因此&#xff0c;在不同的角度或不同的层次上&#xff0c;对中间件的分类也会有所不同。 根据IDC在1998年对中间件进行的分类&#xff0c;把中间件分为终端仿真/屏幕转换…

面试题——Nginx

1.Nginx是什么&#xff1f; 是一个高性能的Web服务器和反向代理服务器&#xff0c;也可以作为静态文件的缓存服务器&#xff0c;也能够进行负载均衡。 2.Nginx的作用&#xff1f; 1.反向代理&#xff1a;将多台服务器代理为一台服务器。客户端不了解底层服务端。 2.负载均衡…

eclipse导入Tomcat9源码

环境准备 下载Tomcat源码 https://github.com/apache/tomcat/tagsJDK版本 Tomcat9要求JDK17以上版本 https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.htmlAnt安装 https://ant.apache.org/bindownload.cgi我这里装的是apache-ant-1.10.14版本 …

CLIP模型调用的一段代码及解释

代码示例 from transformers import CLIPProcessor, CLIPModel# 加载预训练的CLIP模型和处理器 model CLIPModel.from_pretrained("openai/clip-vit-base-patch32") processor CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")# 显示图像…

从0到1,揭秘AI产品经理的高薪秘诀,转型之路与实战资源全解析

前言 随着算法模型的日益精进、计算能力的显著提升以及海量数据的积累&#xff0c;人工智能领域正以前所未有的速度蓬勃发展。 在国家政策的积极推动、社会资本的强劲注入下&#xff0c;人工智能产业正处于技术快速进步的黄金时期&#xff0c;其影响力广泛渗透至教育智能化、…

Day54 代码随想录打卡|二叉树篇---二叉搜索树的最近公共祖先

题目&#xff08;leecode T235&#xff09;&#xff1a; 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、q 的祖…

Nginx负载均衡之负载均衡策略

负载均衡技术是将大量的客户端请求通过特定的策略分配到集群中的节点&#xff0c;实现快速响应的应用技术。在应对高并发的应用请求时&#xff0c;单节点的应用服务计算能力有限&#xff0c;无法满足客户端的响应需求&#xff0c;通过负载均衡技术&#xff0c;可以将请求分配到…

DAY 45 企业级虚拟化技术KVM

企业级虚拟化技术KVM 1.kvm是什么 kernel virtualization machine 内核虚拟机 qemu的二次开发 软件全拼 qemu-kvm kvm virtulbox ovm vmware vsphere套件&#xff08;vmawre-esxi&#xff09; microsoft hyper-V 2.什么是虚拟化 资源利用 资源隔离 虚拟化管理&…

CleanMyMac X for Mac系统优化垃圾清理软件卸载 工具(小白轻松上手,简单易学)

Mac分享吧 文章目录 效果一、准备工作二、开始安装1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、启动台显示软件图标&#xff0c;表示安装成功 三、运行测试1、打开软件&#xff0c;配置2、授权&#xff0c;允许完全磁盘访问 安装完成&a…

驱动、BSP、HAL三者的区别和联系

目录 引言 一、驱动&#xff08;Driver&#xff09; 二、板级支持包&#xff08;BSP, Board Support Package&#xff09; 三、硬件抽象层&#xff08;HAL, Hardware Abstraction Layer&#xff09; 四、区别与联系 五、总结 引言 驱动&#xff08;Driver&#xff09;、板…

正规式理解

正规式&#xff08;Regular Expression&#xff09;是一种用于描述、识别字符串集合的模式&#xff08;尤其是正则语言&#xff09;的序列表达式。在软件设计中&#xff0c;正规式被广泛用于文本处理、搜索和替换、数据验证等场景。以下是对正规式的基本理解&#xff1a; 1. *…

django filter 数据 Response返回

在Django中&#xff0c;你可以使用Django的filter()方法来筛选查询集(QuerySet)&#xff0c;并将结果返回给客户端。以下是一个简单的例子&#xff0c;展示了如何在Django视图中筛选数据&#xff0c;并将结果以JSON的形式返回给客户端。 首先&#xff0c;确保你有一个Django模…

vue3 defineComponent + 渲染函数h + 全局注册​

defineComponent 是 Vue 3 中的一个函数&#xff0c;用于定义一个组件。它是 Vue 3 的组合式 API 的一部分&#xff0c;提供了一种更加灵活和组织化的方式来定义组件。在 Vue 2 中&#xff0c;我们通常使用一个对象来定义组件&#xff0c;而在 Vue 3 中&#xff0c;defineCompo…

赶走异味保持清香,何浩明净味爽身香体膏

夏天来了&#xff0c;大家都想要清清爽爽的出门&#xff0c;但是汗味、狐臭这些小问题都在所难免&#xff0c;总要想办法应对&#xff0c;我目前用的是一款香体膏&#xff0c;它不仅能赶走那些让人尴尬的异味&#xff0c;还能让我们享受一整天的清新自在。 我用的这款叫做何浩明…

解决接入sleuth链路追踪后xxl-job定时任务的日志无日志问题

问题背景 随着业务规模的不断的增大, 系统的复杂度也越来越高, 公司软件架构也进入到了分布式微服务的阶段, 在这样的情况下每一次请求都有可能跨越多个项目&#xff0c; 传统的日志监控方式无法满足调用链路追踪, 这就导致问题定位/诊断服务变得复杂。所以我们引入了sleuth这一…

STM32MP135裸机编程:配置RCC,修改主频到1GHz

0 工具准备 STM32CubeMX v6.11.1 STM32CubeIDE v1.15 STM32CubeProgrammer v2.16.0 STM32MP13xx参考手册 STM32MP13勘误手册 STM32MP135AD数据手册 正点原子stm32MP135开发板 1 确认时钟源 本例使用的时钟源均由外部晶振提供&#xff0c;分别是24MHz的HSE、32.768KHz的LSE。原…