设计一个Rust线程安全栈结构 Stack<T>
在Rust中,设计一个线程安全的栈结构Stack<T>
,类似于Channel<T>
,但使用栈的FILO(First-In-Last-Out)原则来在线程间传送数据,可以通过使用标准库中的同步原语如Mutex
和Condvar
来实现。下面是一个简单的实现示例:
use std::collections::VecDeque;
use std::sync::{Mutex, Condvar};
use std::thread;
use std::time::Duration;pub struct Stack<T> {data: Mutex<VecDeque<T>>,not_empty: Condvar,
}impl<T> Stack<T> {pub fn new() -> Stack<T> {Stack {data: Mutex::new(VecDeque::new()),not_empty: Condvar::new(),}}pub fn push(&self, item: T) {let mut data = self.data.lock().unwrap();data.push_front(item);self.not_empty.notify_one();}pub fn pop(&self) -> Option<T> {let mut data = self.data.lock().unwrap();while data.is_empty() {data = self.not_empty.wait(data).unwrap().0;}data.pop_back()}
}// 示例用法
fn main() {let stack = Stack::new();let producer = thread::spawn(move || {for i in 1..=5 {stack.push(i);println!("Produced {}", i);thread::sleep(Duration::from_millis(500));}});let consumer = thread::spawn(move || {while let Some(item) = stack.pop() {println!("Consumed {}", item);}});producer.join().unwrap();consumer.join().unwrap();
}
在这个示例中,Stack<T>
结构包含了一个受互斥锁保护的VecDeque<T>
,它用作底层的数据存储。VecDeque
是一个双端队列,但在这里我们只使用其作为栈的功能,通过push_front
和pop_back
方法来模拟栈的行为。not_empty
是一个条件变量,用于在栈为空时阻塞消费者线程,直到有数据可用。
在push
方法中,我们将数据项推入栈中,并通过notify_one
方法唤醒一个等待的消费者线程(如果有的话)。在pop
方法中,我们检查栈是否为空,并在为空时使用wait
方法阻塞当前线程,直到有数据被推入栈中。当栈不为空时,我们从栈中弹出一个数据项并返回它。
在示例的main
函数中,我们创建了一个Stack<i32>
实例,并启动了一个生产者线程和一个消费者线程。生产者线程将数字1到5推入栈中,每次推送后休眠500毫秒。消费者线程则不断地从栈中弹出数据项,并打印它们,直到栈为空为止。
相关文章:
设计一个Rust线程安全栈结构 Stack<T>
在Rust中,设计一个线程安全的栈结构Stack<T>,类似于Channel<T>,但使用栈的FILO(First-In-Last-Out)原则来在线程间传送数据,可以通过使用标准库中的同步原语如Mutex和Condvar来实现。下面是一个…...

Docker Desktop 在 Windows 上的安装和使用
目录 1、安装 Docker Desktop 2、使用 Docker Desktop (1)运行容器 (2)查看容器信息 (3)数据挂载 Docker Desktop是Docker的官方桌面版,专为Mac和Windows用户设计,提供了一个简…...

2024年最受欢迎的 19 个 VS Code 主题排行榜
博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …...
突破编程_C++_网络编程(OSI 七层模型(物理层与数据链路层))
1 OSI 七层模型概述 OSI(Open Systems Interconnection)七层模型,即开放系统互联参考模型,起源于 20 世纪 70 年代和 80 年代。随着计算机网络技术的快速发展和普及,不同厂商生产的计算机和网络设备之间的互操作性成为…...
Spring boot如何使用redis缓存
引入依赖 这个是参照若依的,如果没有统一的版本规定的话,这里是需要写版本号的 <!-- redis 缓存操作 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</arti…...

红蓝色WordPress外贸建站模板
红蓝色WordPress外贸建站模板 https://www.mymoban.com/wordpress/5.html...

python爬虫----了解爬虫(十一天)
🎈🎈作者主页: 喔的嘛呀🎈🎈 🎈🎈所属专栏:python爬虫学习🎈🎈 ✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天…...

碳素光线疗法与宠物健康
碳素光线与宠物健康 生息在地球上的所有动物、在自然太阳光奇妙的作用下、生长发育。太阳光的能量使它们不断进化、繁衍种族。现在、生物能够生存、全仰仗于太阳的光线。太阳光线中、包含有动物健康所需要的极为重要的波长。因此、和户外饲养的动物相比、在室内喂养的观赏动物、…...
展锐平台camera添加底层水印
展锐平台camera添加水印,从底层用编码覆盖图像数组,保证上层获取图像水印的一致性 时间水印diff --git a/vendor/sprd/modules/libcamera/hal3_2v6/SprdCamera3HWI.cpp b/vendor/sprd/modules/libcamera/hal3_2v6/SprdCamera3HWI.cpp index f2b704f9d6..…...

OSX-02-Mac OS应用开发系列课程大纲和章节内容设计
本节笔者会详细介绍下本系统专题的大纲,以及每个专题章节的组织结构。这样读者会有一个全局的概念。 在开始前还是在再介绍一下下面这个框架图,因为比较重要,在这里再冗余介绍一下。开发Apple公司相关产品的软件时,主要有两个框架…...

热门IT【视频教程】-华为/思科/红帽/oracle
华为认证 网络工程师-入门基础课:华为HCIA认证课程介绍-CSDN博客 网络工程师进阶课:华为HCIP认证课程介绍-CSDN博客 职场进阶,踏上高峰——HCIE-Datacom认证-CSDN博客 华为HCIA试听课程 : 超级实用,华为VRP系统文件…...

HCTNet:一种用于乳腺超声图像分割的混合CNN-transformer
HCTNet:一种用于乳腺超声图像分割的混合CNN-transformer 摘要引言相关工作方法 Materials and methods分割方法 HCTNet_ A hybrid CNN-transformer network for breast ultrasound image segmentation 摘要 乳腺超声图像的自动分割有助于提高乳腺癌诊断的准确性。近…...
766. 托普利茨矩阵
给你一个 m x n 的矩阵 matrix 。如果这个矩阵是托普利茨矩阵,返回 true ;否则,返回 false 。 如果矩阵上每一条由左上到右下的对角线上的元素都相同,那么这个矩阵是 托普利茨矩阵 。 示例 1: 输入:matr…...

基于STM32的汽车防窒息系统
文章目录 基于STM32的汽车防窒息系统系统简介材料展示视频制作硬件连接原理图PCB实物图GSM模块使用GSM模块代码 SGP30模块SGP30模块代码 步进电机驱动步进电机代码 其他模块主逻辑代码 总结 基于STM32的汽车防窒息系统 系统简介 随着社会的发展目前汽车的流行,汽车大…...

GoogleNet神经网络介绍
一、简介 GoogleNet,也称为GoogLeNet,是谷歌工程师设计的一种深度神经网络结构,它在2014年的ImageNet图像识别挑战赛中取得了冠军。该神经网络的设计特点主要体现在其深度和宽度上,通过引入名为Inception的核心子网络结构&#x…...

AI水下颜色校正解决方案,助力企业打造水下视觉盛宴
水下摄影作为一种独特且富有挑战性的拍摄方式,正受到越来越多旅行者和摄影师的青睐。然而由于海水的光线折射和金属成分的影响,水下拍摄的照片和视频往往存在严重的偏色问题,无法真实还原水下世界的美丽与神奇。美摄科技凭借深厚的技术积累和…...

LINUX笔记温习
目录 DAY1 DAY2 day3: day4 day5 day6 day7 day8 day9 day10 day11 day12 day13 day14 day15 20day DAY1 1、多层级文件夹创建要带-p; 2、创建多文件,要先到该目录下才能创建(第一个目录必须存在才能有效建立); D…...

钉钉服务端API报错 43008 参数需要multipart类型
钉钉服务端API报错 43008 参数需要multipart类型 problem 使用媒体文件上传接口,按照文档输入参数,结果返回报错 # 参数 {"access_token": "xxx""type": "image","media": "/Users/xxx/xxx/s…...

HarmonyOS NEXT应用开发案例——阻塞事件冒泡
介绍 本示例主要介绍在点击事件中,子组件enabled属性设置为false的时候,如何解决点击子组件模块区域会触发父组件的点击事件问题;以及触摸事件中当子组件触发触摸事件的时候,父组件如果设置触摸事件的话,如何解决父组…...

【C语言】联合和枚举
个人主页点这里~ 联合和枚举 一、联合体1、联合体类型的声明2、联合体成员的特点3、与结构体对比4、计算联合体大小 二、枚举1、枚举的声明2、枚举的优点3、枚举类型的使用 一、联合体 1、联合体类型的声明 联合体的定义与结构体相似,但是联合体往往会节省更多的空…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
git: early EOF
macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...
【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统
Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...

Linux操作系统共享Windows操作系统的文件
目录 一、共享文件 二、挂载 一、共享文件 点击虚拟机选项-设置 点击选项,设置文件夹共享为总是启用,点击添加,可添加需要共享的文件夹 查询是否共享成功 ls /mnt/hgfs 如果显示Download(这是我共享的文件夹)&…...
02-性能方案设计
需求分析与测试设计 根据具体的性能测试需求,确定测试类型,以及压测的模块(web/mysql/redis/系统整体)前期要与相关人员充分沟通,初步确定压测方案及具体的性能指标QA完成性能测试设计后,需产出测试方案文档发送邮件到项目组&…...

使用VMware克隆功能快速搭建集群
自己搭建的虚拟机,后续不管是学习java还是大数据,都需要集群,java需要分布式的微服务,大数据Hadoop的计算集群,如果从头开始搭建虚拟机会比较费时费力,这里分享一下如何使用克隆功能快速搭建一个集群 先把…...