当前位置: 首页 > news >正文

【并发编程】线程安全的栈容器

std::stack容器的接口包括 empty(), size(), top(), push(), pop()等。

问题

其原接口在多线程的情况下,会持续很多问题。

例如,在std::stack容器的接口中,在多线程下应用时,empty()和size()的结果是不可信的。因为尽管在某线程调用empty()或size()时,返回值可能是正确的,但是一旦函数返回,其他线程就不再受限,从而能自由地访问栈容器,可能马上会有新元素入栈,或者现有的元素立即出栈,这会使前面线程得到的结果失效。

其次,top()和pop()之间也存在着竞争条件,例如

线程A线程B
if(!s.empty());
if(!s.empty());
 int const value = s.top();
 int const value = s.top();
s.pop()
do_something(value);s.pop()
do_something(value);

假设,当前只有两个线程正在运行,且在两个top()调用之间不存在其他操作,那么栈容器不会被更改,即两个线程会得到相同的值。另外,在top()与pop()的调用之间也没有其他调用,结果栈顶元素被调用了两次,但栈顶的第二个元素却始终没被读取就丢弃了。

解决方法

为了线程安全,在每次操作之前,都加锁

面对第二个问题,将top()和pop()操作合二为一

#include <memory>
#include <mutex>
#include <stack>using namespace std;struct empty_stack :std::exception
{const char* what() const throw();
};template<typename T>
class threadsafe_stack
{
private:stack<T> data;mutable mutex m;public:threadsafe_stack() {};threadsafe_stack(const threadsafe_stack& other){lock_guard<mutex> lock(other.m);data = other.data;}threadsafe_stack& operator=(const threadsafe_stack&) = delete;void push(T new_value){lock_guard<mutex> lock(m);data.push(move(new_value));}shared_ptr<T> pop(){lock_guard<mutex> lock(m);if (data.empty()) throw empty_stack();shared_ptr<T>const res(std::make_shared<T>(data.top()));data.pop();return res;}void pop(T& value){lock_guard<mutex> lock(m);if (data.empty()) throw empty_stack();value = data.top();data.pop();}bool empty() const{lock_guard<mutex> lock(m);return data.empty();}
};

相关文章:

【并发编程】线程安全的栈容器

std::stack容器的接口包括 empty(), size(), top(), push(), pop()等。 问题 其原接口在多线程的情况下&#xff0c;会持续很多问题。 例如&#xff0c;在std::stack容器的接口中&#xff0c;在多线程下应用时&#xff0c;empty()和size()的结果是不可信的。因为尽管在某线程…...

ES嵌套查询和普通查询的高亮显示区别

在 Elasticsearch 中&#xff0c;高亮显示是一种强大的搜索结果可视化工具&#xff0c;它可以帮助我们快速识别匹配的关键字或短语。在ES中&#xff0c;我们可以使用两种不同的查询方式来实现高亮显示&#xff1a;嵌套查询和普通查询。本文探讨这两种查询方式的高亮显示区别以及…...

Greenplum集群部署

一,安装说明 1.1环境说明 *名称**版本*操作系统CentOS 7.6 64bitgreenplumgreenplum-db-6.10.1-rhel7-x86_64.rpm1.2集群介绍 IPhostname集群节点10.240.3.244gpmastermaster10.240.3.245gpsegment1segment10.240.3.246gpsegment2segment二,安装环境准备 2.1 修改各节点名称…...

电教智能云数据可视化平台开发电能优化日志实录

电教智能云数据可视化平台开发电脑优化日志实录 一、2K和4K弹窗判断二、电能API对接1.电脑爬虫2.电能分组过滤3.数据可视化渲染4.弹窗 三.数组按顺序输出 一、2K和4K弹窗判断 {* 判断2k和4k弹窗 *}{if $dataScene[scene_standard] eq 0}<a class"menuBtn subMenu"…...

JSX语法基础总结

题记&#xff1a;首先我们要了解一下jsx是什么&#xff0c;跟js有什么区别&#xff0c;其实就是js的语法糖&#xff0c;加上了xml的语法&#xff0c;使得产生虚拟dom更加的方便&#xff0c;简单说一下&#xff0c;xml就是存储数据的格式&#xff0c;想了解xml的话&#xff0c;可…...

socker套接字

1.打印错误信息 2.socketaddr_in结构体 结构体&#xff1a; &#xff08;部分库代码&#xff09; (宏中的##) 3.manual TCP: SOCK_STREAM &#xff1a; 提供有序地&#xff0c;可靠的&#xff0c;全双工的&#xff0c;基于连接的流式服务 UDP: 面向数据报...

No111.精选前端面试题,享受每天的挑战和学习

文章目录 map和foreach的区别在组件中如何获取vuex的action对象中的属性怎么去获取封装在vuex的某个接口数据有没有抓包过&#xff1f;你如何跟踪某一个特定的请求&#xff1f;比如一个特定的URL&#xff0c;你如何把有关这部分的url数据提取出来&#xff1f;1. 使用网络抓包工…...

【Apollo学习笔记】—— 相机仿真

文章目录 前言相关代码整理 测试实践文件目录包管理BUILD文件以及cyberfile.xml文件源程序BUILD运行结果其他参考CameraOutput channels启动camera驱动启动camera video compression驱动 前言 本文是对Cyber RT的学习记录,文章可能存在不严谨、不完善、有缺漏的部分&#xff0…...

【数据结构】——线性表的相关习题

目录 题型一&#xff08;线性表的存储结构&#xff09;题型二&#xff08;链表的判空&#xff09;题型三&#xff08;单链表的建立&#xff09;题型四&#xff08;顺序表、单链表的插入删除操作&#xff09;题型五&#xff08;双链表的插入删除操作&#xff09;题型六&#xff…...

SpringBoot集成Elasticsearch8.x(8)|(新版本Java API Client的Painless语言脚本script使用)

SpringBoot集成Elasticsearch8.x&#xff08;8&#xff09;|&#xff08;新版本Java API Client的Painless语言脚本script使用&#xff09; 文章目录 SpringBoot集成Elasticsearch8.x&#xff08;8&#xff09;|&#xff08;新版本Java API Client的Painless语言脚本script使用…...

SpringBoot复习:(19)Condition接口和@Conditional注解

Condition接口代码如下&#xff1a; public interface Condition {boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);}它是一个函数式接口&#xff0c;只有一个方法matches用来表示条件是否满足。matches方法中的ConditionContext类对象context可以…...

K8s中的Controller

Controller的作用 &#xff08;1&#xff09;确保预期的pod副本数量 &#xff08;2&#xff09;无状态应用部署 &#xff08;3&#xff09;有状态应用部署 &#xff08;4&#xff09;确保所有的node运行同一个pod&#xff0c;一次性任务和定时任务 1.无状态和有状态 无状态&…...

【MFC】03.常用复杂控件的使用-笔记

热键&#xff1a; 对话框-类向导&#xff1a;初始化函数中&#xff0c;热键需要在最开始的时候就注册进去&#xff1a; 注册热键&#xff1a; 在这之前&#xff0c;先去定义一个宏&#xff0c;代表你这个快捷键。 参数&#xff1a;窗口句柄&#xff0c;热键编号&#xff08;热…...

Autosar诊断实战系列14-NRC优先级解析

本文框架 前言1. NRC分类2. NRC优先级判断2.1. NRC优先级判断逻辑介绍2.2 NRC测试注意事项前言 在本系列笔者将结合工作中对诊断实战部分的应用经验进一步介绍常用UDS服务的进一步探讨及开发中注意事项, Dem/Dcm/CanTp/Fim模块配置开发及注意事项,诊断与BswM/NvM关联模块的应…...

《向量数据库指南》——腾讯云向量数据库Tencent Cloud VectorDB产品特性,架构和应用场景

腾讯云向量数据库(Tencent Cloud VectorDB)是一款全托管的自研企业级分布式数据库服务,专用于存储、检索、分析多维向量数据。该数据库支持多种索引类型和相似度计算方法,单索引支持 10 亿级向量规模,可支持百万级 QPS 及毫秒级查询延迟。腾讯云向量数据库不仅能为大模型提…...

xcode 的app工程与ffmpeg 4.4版本的静态库联调,ffmpeg内下的断点无法暂停。

先阐述一下我的业务场景&#xff0c;我有一个iOS的app sdk项目&#xff0c;下面简称 A &#xff0c;以及运行 A 的 app 项目&#xff0c;简称 A demo 。 引用关系为 A demo 引用了 A &#xff0c;而 A 引用了 ffmpeg 的静态库&#xff08;.a文件&#xff09;。此时业务出现了 b…...

机器学习06 数据准备-(利用 scikit-learn基于Pima Indian数据集作 数据特征选定)

什么是数据特征选定? 数据特征选定&#xff08;Feature Selection&#xff09;是指从原始数据中选择最相关、最有用的特征&#xff0c;用于构建机器学习模型。特征选定是机器学习流程中非常重要的一步&#xff0c;它直接影响模型的性能和泛化能力。通过选择最重要的特征&#…...

机器学习-特征选择:如何使用Lassco回归精确选择最佳特征?

一、引言 特征选择在机器学习领域中扮演着至关重要的角色&#xff0c;它能够从原始数据中选择最具信息量的特征&#xff0c;提高模型性能、减少过拟合&#xff0c;并加快模型训练和预测的速度。在大规模数据集和高维数据中&#xff0c;特征选择尤为重要&#xff0c;因为不必要的…...

SpringBoot之Actuator基本使用

SpringBoot之Actuator基本使用 引入分类常用接口含义healthbeansconditionsheapdumpmappingsthreaddumploggersmetrics 引入 <!-- actuator start--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter…...

排序算法(一)

1.冒泡排序-Bubble Sort 1.算法原理 依次比较相邻的两个元素&#xff0c;若按照从小到大的顺序&#xff0c;则将相邻元素中较大的一个放在后面&#xff1b;然后对每一对相邻元素都做这种比较&#xff0c;序列的最后一个元素就是最大的数&#xff1b; 2.算法复杂度 时间复杂度…...

书匠策AI降重降AIGC实测|官网www.shujiangce.com |微信公众号搜一搜 书匠策AI

&#x1f9ea; 一个实验室级别的"论文手术台" 各位正在跟毕业论文死磕的朋友&#xff0c;我今天不讲方法论&#xff0c;不拆写作技巧&#xff0c;我要给你们开一间"论文急诊室"。 你有没有经历过这种绝望&#xff1a;辛辛苦苦写完一万字&#xff0c;查重…...

Hi3861驱动MPU6050与OLED:嵌入式I2C传感器数据采集与显示实战

1. 项目概述与核心价值最近在捣鼓小熊派的Hi3861开发板&#xff0c;想用它来做个姿态传感器的小玩意儿。核心想法很简单&#xff1a;通过I2C总线读取MPU6050六轴传感器的数据&#xff0c;然后把姿态角&#xff08;比如俯仰角、横滚角&#xff09;实时显示在一块小小的OLED屏幕上…...

5分钟快速上手Py-ART:气象雷达数据分析的终极Python工具包

5分钟快速上手Py-ART&#xff1a;气象雷达数据分析的终极Python工具包 【免费下载链接】pyart The Python-ARM Radar Toolkit. A data model driven interactive toolkit for working with weather radar data. 项目地址: https://gitcode.com/gh_mirrors/py/pyart Py-…...

HTTPS单向认证、双向认证、抓包原理与反抓包策略详解

HTTPS单向认证、双向认证、抓包原理与反抓包策略详解 一、HTTPS单向认证 HTTPS单向认证是只要求站点部署 SSL证书&#xff0c;客户端会去验证服务器的身份&#xff0c;而服务器不会去验证客户端的身份。这种认证方式相对简单&#xff0c;但可以提供一定的 安全性。任何用户都可…...

长期项目中使用Taotoken观测用量与优化API调用策略

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 长期项目中使用Taotoken观测用量与优化API调用策略 在持续数月的开发项目中&#xff0c;团队对大型语言模型的调用往往从简单的功能…...

Tomcat 超精简总结

1. 定位轻量级 Java Web 服务器 / Servlet 容器只跑 Java 项目&#xff08;jsp、servlet、springboot 内嵌&#xff09;处理 动态请求&#xff0c;不擅长静态资源2. 核心作用解析 Servlet、JSP监听端口&#xff0c;接收浏览器请求调用 Java 代码执行业务返回页面 / 数据给客户端…...

FPGA时序约束避坑指南:Set Bus Skew与Set Max Delay到底有什么区别?

FPGA时序约束深度解析&#xff1a;Set Bus Skew与Set Max Delay的核心差异与工程实践 在FPGA设计的时序收敛过程中&#xff0c;工程师们常常面临一个关键抉择&#xff1a;何时使用Set Max Delay&#xff0c;何时又该选择Set Bus Skew&#xff1f;这两种约束看似都与路径延迟相关…...

YOLO-ONNX-Java分布式推理架构设计与实现

YOLO-ONNX-Java分布式推理架构设计与实现 引言&#xff1a;单机推理的性能瓶颈 在实际的AI视觉识别项目中&#xff0c;随着业务规模的扩大&#xff0c;单机推理往往面临以下挑战&#xff1a; 并发处理能力有限&#xff1a;单台服务器无法同时处理大量视频流GPU资源利用率低&…...

终极TFTP服务器解决方案:Tftpd64网络服务一体化配置完全指南 [特殊字符]

终极TFTP服务器解决方案&#xff1a;Tftpd64网络服务一体化配置完全指南 &#x1f680; 【免费下载链接】tftpd64 The working repository of the famous TFTP server. 项目地址: https://gitcode.com/gh_mirrors/tf/tftpd64 Tftpd64是一款轻量级、多线程的网络服务套件…...

MATLAB文件选择对话框uigetfile()保姆级教程:从单文件到多选的完整配置流程

MATLAB文件选择对话框uigetfile()实战指南&#xff1a;从基础配置到高级技巧 在MATLAB日常开发中&#xff0c;文件选择对话框是用户交互的重要组成部分。uigetfile()函数作为MATLAB内置的文件选择工具&#xff0c;其灵活性和可定制性往往被初学者低估。本文将带您深入探索这个看…...