设计基于锁的并发数据结构

1. 线程安全的栈容器

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

2. 线程安全的队列容器

采用条件变量实现。

#include <condition_variable>
#include <mutex>
#include <queue>
#include <thread>template <typename T>
class threadsafe_queue {
private:mutable std::mutex m_mutex;std::queue<T> m_data_queue;std::condition_variable m_data_cond;
public:threadsafe_queue(){}void push (T new_value){std::lock_guard<std::mutex> lock (m_mutex);m_data_queue.push (std::move (new_value));m_data_cond.notify_one();}void wait_and_pop (T &value){std::unique_lock<std::mutex> lock (m_mutex);m_data_cond.wait (lock, [this] { return !m_data_queue.empty(); });value = std::move (m_data_queue.front());m_data_queue.pop();}std::shared_ptr<T> wait_and_pop (){std::unique_lock<std::mutex> lock (m_mutex);m_data_cond.wait (lock, [this] { return !m_data_queue.empty(); });std::shared_ptr<T> res (std::make_shared<T> (std::move (m_data_queue.front())));m_data_queue.pop();return res;}bool try_pop (T &value){std::lock_guard<std::mutex> lock (m_mutex);if (m_data_queue.empty())return false;value = std::move (m_data_queue.front());m_data_queue.pop();return false;}std::shared_ptr<T> try_pop (){std::lock_guard<std::mutex> lock (m_mutex);if (m_data_queue.empty())return std::make_shared<T>();std::shared_ptr<T> res (std::make_shared<T> (std::move (m_data_queue.front())));m_data_queue.pop();return res;}bool empty () const{std::lock_guard<std::mutex> lock (m_mutex);return m_data_queue.empty();}
};

参考书籍:《C++并发编程实战 第2版》

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

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

相关文章

记录vite打包并上传到npm

开始 起因&#xff1a;我们单位这个项目用的vitereact使用print打印 开发环境没问题、一到打包时就卡住、所以我就想单独打包成组件在引用看看还有问题么、结果还真可以&#xff01;又是离谱的一天 首先需要把npm的分支切换成官网地址、因为只有官网地址才能登陆npm账号 这里说…

FreeRTOS学习 -- 移植

一、添加FreeRTOS源码 在基础工程中新建一个名为FreeRTOS的文件夹&#xff0c;创建FreeRTOS文件夹以后将FreeRTOS的源码添加到这个文件夹中。 portable 文件夹&#xff0c;只需要保留keil、MemMang 和 RVDS这三个文件夹&#xff0c;其他的都可以删除掉。 移植FreeRTOSConfig…

SimOne协作版正式发布!“云+端”一体化,加速自动驾驶技术迭代!

创新的“云端”一体化方案 让11大于2 两端登录 场景共享 本地算法 云端并发 颠覆传统自动驾驶研发工作方式 加速自动驾驶算法迭代与优化 SimOne协作版正式发布&#xff01; 什么是SimOne协作版&#xff1f; SimOne协作版&#xff0c;一个创新的“云端”一体化产品。 它将…

【数学建模】机器人避障问题

已知&#xff1a; 正方形5的左下顶点坐标 ( 80 , 60 ) (80,60) (80,60)&#xff0c;边长 150 150 150机器人与障碍物的距离至少超过 10 10 10个单位规定机器人的行走路径由直线段和圆弧组成&#xff0c;其中圆弧是机器人转弯路径。机器人不能折线转弯&#xff0c;转弯路径由与…

如何在rosbag中获取第一帧数据

文章目录 1. 找出感兴趣的话题名2. 在一个终端中启动rosbag play3. 在另一个终端中使用rostopic echo4. 继续播放bag文件&#xff1a; 1. 找出感兴趣的话题名 首先&#xff0c;你需要知道你感兴趣的话题名称。可以通过rosbag info your_bagfile.bag来查看bag文件中包含的话题。…

代码随想录-算法训练营day02【数组02:滑动窗口、螺旋矩阵】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客 https://docs.qq.com/doc/DUGRwWXNOVEpyaVpG?uc71ed002e4554fee8c262b2a4a4935d8977.有序数组的平方 &#xff0c;209.长度最小的子数组 &#xff0c;59.螺旋矩阵II &#xff0c;总结 建议大家先独立做题&#xff0c;…

基于 MATLAB 和 App Designer 的 UI 交互框架开发的一款电力系统潮流计算工具

基于 MATLAB 和 App Designer 的 UI 交互框架开发的一款电力系统潮流计算工具 文章目录 基于 MATLAB 和 App Designer 的 UI 交互框架开发的一款电力系统潮流计算工具一、软件介绍二、软件功能1、数据输入 2、潮流作业设置3、 潮流结果报表及可视化三、 软件设计思路1 、牛顿拉…

【Vue3语法单文件——自用】

1. Vue3基础语法 <script setup> import { ref,computed } from vue// 定义响应式的变量 const count ref(0) const author ref({name: John Doe,books: [Vue 2 - Advanced Guide,Vue 3 - Basic Guide,Vue 4 - The Mystery] }) //定义props const props defineProps(…

为什么forEach中的await不起作用

在JavaScript的forEach方法中使用await是无效的&#xff0c;因为forEach方法不支持异步操作的等待。 forEach是一个数组的遍历方法&#xff0c;它会对数组中的每个元素依次执行提供的回调函数。而在JavaScript中&#xff0c;await关键字只能在异步函数(async函数)中使用&#…

[RK3399 Linux] 移植Linux 5.2.8内核详解

背景是在RK3399上面移植Rockchip官方提供的u-boot 2017.09 一、linux内核 1.1 源码下载 内核源码下载地址为:《https://www.kernel.org/》: 也可以到内核镜像网址下载https://mirrors.edge.kernel.org/pub/linux/kernel/,这里下载速度更快。 如果下载速度太慢,无法下载,…

代码随想录刷题day51|股票买卖(含冷冻期)股票买卖(含手续费)

文章目录 day51学习内容一、股票买卖--含冷冻期1.1、动态规划五部曲1.1.1、 确定dp数组&#xff08;dp table&#xff09;以及下标的含义1.1.2、确定递推公式1.1.3、 dp数组如何初始化1.1.4、确定遍历顺序1.1.5、输出结果 1.2、代码 二、股票买卖--含手续费2.1、动态规划五部曲…

批量clone某个github用户的所有项目

要批量克隆某个 GitHub 用户的所有仓库&#xff0c;你可以使用 GitHub API 来列出该用户的所有仓库&#xff0c;并使用命令行工具来进行克隆。以下是一种可能的方法&#xff1a; 获取 GitHub API 访问令牌&#xff1a;首先&#xff0c;你需要在 GitHub 上生成一个访问令牌&…

蓝牙app设计(方案二) E4A (时钟 优缺点)

例程改的! 主界面 虽然上面有搜索功能,但是本人建议先自行配对在使用,这样更好用,把要使用的设备收藏一下更好找哦(这样就是橙色的了,只需要点对应蓝牙左边) 代码修改部分 原版是不停向下滚动显示,这样个人觉得不太好看,所以加了个时钟,到对应时钟周期清空(达到刷…

BGP小实验

光只是知道理论还不行&#xff0c;还是要多动手练练&#xff0c;就练一个bgp实验吧&#xff0c;梳理一下做题思路 实验要求&#xff1a; 大体要求就是&#xff1a;R1的环回可以ping通R2-R5的环回&#xff0c;R5同理 思路&#xff1a; 基础配置&#xff1a; 第一步先把地址环…

二叉树练习day.7

530.二叉搜索树的最小绝对差 链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数&#xff0c;其数值等于两值之差的绝对值。 示例 1&…

【记录】Prompt模板|作为甲方怎么清晰专业地描述自己的需求(又名“乙方,给你的甲方扔个GPT解放自己吧”)

这篇Prompt摘抄并修改自朋友送给我的书的第49页5.2.3让ChatGPT构建提示&#xff0c;质量挺不错&#xff0c;支持一下她的博客&#xff1a;【好书推荐2】AI提示工程实战&#xff1a;从零开始利用提示工程学习应用大语言模型。 书长这样&#xff1a; 不啰嗦了&#xff0c;正文如…

多张图如何制作一图一码?图片批量转二维码的制作方法

二维码现在经常被用来作为图片的载体&#xff0c;将图片生成二维码之后通过扫描二维码的方式来查看图片信息&#xff0c;那么如果遇到需要将几十张图片分别单独制作二维码的需求时&#xff0c;有什么方法能够一次性批量建码呢&#xff0c;相信有很多的小伙伴对这个问题的解决方…

关于conda安装pytorch gpu总是会自动变成cpu版本

这篇文章讲了三种方法&#xff0c;由于我使用的服务器无法连接外网&#xff0c;所以这些方法我没成功安装的pytorch不是GPU版本而是CPU版本_pytorch安装包里只是cpu-CSDN博客 然后我瞎试发现使用 conda install dataclasses 居然能够连带着把gpu版本的pytorch下载下来&…

arm64位系统中编译ffmpeg

大致过程仍然和x86平台一致&#xff1a; ./configure xxxxmakemake install 所需要变化的是需要在 ./configure xxxx 后面多加几个编译选项 cd ffmpeg ./configure (x64下的依赖配置&#xff1a;......)--prefixbin --archaarch64 --target-oslinux --enable-cross-compile …

水仙花数python

水仙花数&#xff08;Narcissistic number&#xff09;是指一个n位正整数&#xff0c;其各位数字的n次幂之和等于该数本身。例如&#xff0c;153是一个3位的水仙花数&#xff0c;因为&#xff1a;1^3 5^3 3^3 153。在Python中&#xff0c;你可以编写一个简单的脚本来找到所有…