Rust有没有信号量机制,在缓存有数据的时候才允许等待的进程取数据?

Rust提供了信号量(Semaphore)机制,尽管它并没有直接提供类似于某些其他编程语言中的Semaphore类。然而,你可以使用std::sync::Mutex和std::sync::Condvar(条件变量)组合来实现信号量的功能。

信号量通常用于控制对共享资源的访问,通过维护一个计数器来限制同时访问资源的线程数。当资源可用时(即缓存中有数据时),等待的线程可以被唤醒并获取资源。

在Rust中,你可以使用Mutex来保护共享资源并提供互斥访问,同时使用Condvar来让等待的线程在条件满足时被唤醒。下面是一个简单的示例,展示了如何使用Mutex和Condvar来实现一个信号量,该信号量允许在缓存有数据时唤醒等待的线程:

use std::sync::{Mutex, Condvar, Arc};  
use std::thread;  
use std::time::Duration;  // 缓存结构  
struct Cache {  data: Mutex<Vec<i32>>,  // 互斥锁保护的数据  not_empty: Condvar,     // 条件变量,用于等待数据可用  not_full: Condvar,      // 条件变量,用于等待空间可用(如果需要的话)  
}  impl Cache {  fn new(capacity: usize) -> Cache {  Cache {  data: Mutex::new(Vec::with_capacity(capacity)),  not_empty: Condvar::new(),  not_full: Condvar::new(),  }  }  // 尝试从缓存中取出数据  fn try_pop(&self) -> Option<i32> {  let mut data = self.data.lock().unwrap();  if data.is_empty() {  None  } else {  Some(data.remove(0))  }  }  // 向缓存中添加数据  fn push(&self, value: i32) {  let mut data = self.data.lock().unwrap();  data.push(value);  self.not_empty.notify_one(); // 通知可能等待的消费者线程  }  // 从缓存中获取数据,如果没有数据则阻塞  fn pop(&self) -> i32 {  let mut data = self.data.lock().unwrap();  while data.is_empty() {  // 等待直到有数据可用或超时  self.not_empty.wait(data.as_mut()).unwrap();  }  data.remove(0)  }  
}  fn main() {  let cache = Arc::new(Cache::new(10)); // 假设缓存容量为10  // 生产者线程  let producer = thread::spawn(move || {  for i in 1..=5 {  thread::sleep(Duration::from_secs(1));  cache.push(i);  println!("Produced: {}", i);  }  });  // 消费者线程  let consumer = thread::spawn(move || {  for _ in 1..=5 {  let value = cache.pop();  println!("Consumed: {}", value);  }  });  // 等待生产者和消费者线程完成  producer.join().unwrap();  consumer.join().unwrap();  
}

在这个示例中,Cache结构体有一个互斥锁data来保护对Vec的访问,以及两个条件变量not_empty和not_full(尽管在这个例子中我们并没有使用not_full,因为我们没有实现缓存满时的等待逻辑)。

pop方法尝试从缓存中取出数据。如果缓存为空,它会调用not_empty.wait(data.as_mut())来阻塞当前线程,同时释放互斥锁,允许其他线程运行。当生产者线程调用push方法并向缓存中添加数据时,它会调用not_empty.notify_one()来唤醒可能正在等待的消费者线程。

这样,我们就实现了一个简单的信号量机制,它允许消费者线程在缓存有数据时获取数据,并在没有数据时等待。

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

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

相关文章

程序员书单推荐:从入门到精通的必读之作

在程序员的职业生涯中&#xff0c;阅读技术书籍是不断学习和提升自我的重要途径。本文将为你推荐一系列从入门到精通的程序员书单&#xff0c;帮助你系统地掌握编程知识、提高技能水平&#xff0c;并在职业生涯中取得更大的进步。 一、入门篇 《Head First C语言》&#xff1…

基于SpringBoot+Vue+ElementUI+Mybatis前后端分离管理系统超详细教程(一)

Vue.js 是一个流行的前端框架&#xff0c;用于构建用户界面和单页应用程序。Vue 2 是其第二个主要版本&#xff0c;它提供了数据绑定、组件化、虚拟DOM等核心特性。要搭建一个 Vue 2 的工程化项目&#xff0c;可以遵循以下步骤&#xff1a; 一、前端环境搭建 &#xff08;一&a…

Maven入门(作用,安装配置,Idea基础maven,Maven依赖,Maven构建项目)【详解】

目录 一. Maven的作用 1.依赖管理 2.统一项目结构 3.项目构建 二.Maven安装配置 1. Maven的仓库类型 2 加载jar的顺序 3. Maven安装配置 4.安装Maven 5.配置仓库 三.idea集成maven 1.给当前project集成maven 2.给新建project集成maven 3.创建maven项目 4.pom…

二维码门楼牌管理系统应用场景:地方社区管理的新利器

文章目录 前言一、地方社区管理部门的门牌信息利用二、与社区管理部门的联动效应三、结论 前言 随着信息技术的不断发展&#xff0c;二维码门楼牌管理系统逐渐成为地方社区管理的新宠。该系统通过集成二维码技术与门楼牌信息&#xff0c;为社区管理带来了前所未有的便利与高效…

git 最基本的几条命令

git 最基本的几条命令 初始化本地仓库和推送到远程仓库 打开命令提示符或PowerShell&#xff1a;在你的本地项目目录中&#xff0c;可以通过文件资源管理器地址栏输入cmd或PowerShell 并回车来打开初始化 Git&#xff1a;git init添加所有文件到新的Git仓库&#xff1a;git a…

Github 2024-03-07Go开源项目日报 Top10

根据Github Trendings的统计,今日(2024-03-07统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10TypeScript项目1Harbor - 开源的云原生注册表项目 创建周期:2908 天开发语言:Go协议类型:Apache License 2.0Star数量:21549 个For…

2024年JSON 面试题目-1

以下是一些可能在2024年JSON相关的热点面试题目&#xff1a; 请解释JSON是什么&#xff0c;以及它与其他数据交换格式&#xff08;如XML&#xff09;相比有哪些优势&#xff1f; JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式&#xff0c;它基于ECMAScript的一…

uniapp 解决请求出现 /sockjs-node/info?t=问题

1. uniapp请求出现 /sockjs-node/info?t问题 1.1. 问题 uniapp项目老是出现 http://192.168.2.106:8080/sockjs-node/info?t1709704280949 1.1. sockjs-node介绍 sockjs-node 是一个JavaScript库&#xff0c;提供跨浏览器JavaScript的API&#xff0c;创建了一个低延迟、全…

selinux规则

selinux状态 相关命令 进程要和文件的安全上下文相匹配&#xff0c;进程才能打开文件 查找这个命令从哪个安装包来的用 yum provides 命令 进程httpd 必须与ls -Z的文件类型一致&#xff0c;要不然在强制模式下面&#xff0c;打开不了 在终端2用此命令&#xff0c;把文件类型改…

【有趣】带照明灯的自行车“铃”

这个自行车“铃”发出的不是令行人刺耳讨厌的金属铃声&#xff0c;而是礼貌友好的“请让路&#xff0c;谢谢&#xff01;”声&#xff0c;新颖而有趣&#xff1b;照明灯则为夜间骑车带来方便&#xff0c;既保安全而又实用。整个装置成本不足10元&#xff0c;制作和安装使用也都…

微信小程序用户登陆和获取用户信息功能实现

官方文档&#xff1a; https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html 接口说明&#xff1a; https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-login/code2Session.html 我们看官方这个图&#xff0c;梳理一下用户…

本地项目推送到腾讯云轻量应用服务器教程(并实现本地推送远程自动更新)

将本地项目上传到腾讯云轻量应用服务器并实现后续的推送更新&#xff0c;具体步骤如下&#xff1a; 在本地项目目录下初始化 Git 仓库&#xff1a; cd 项目目录 git init将项目文件添加到 Git 仓库并提交&#xff1a; git add . git commit -m "Initial commit"在…

git 命令怎么回退到某个特定的 commit 并将其推送到远程仓库?

问题 不小心把提交的名称写错提交上远程仓库了&#xff0c;这里应该是 【029】的&#xff0c;这个时候我们想回到【028】这一个提交记录&#xff0c;然后再重新提交【029】到远程仓库&#xff0c;该怎么处理。 解决 1、首先我们找到【028】这条记录的提交 hash&#xff0c;右…

centos cat命令

cat命令主要有两个功能&#xff1a;显示文件内容和创建文件&#xff1a; 1. 显示文件内容cat /dev/opt/text.log 2. 在终端中查看多个文件的内容 cat test1.txt test2.txt 3. 在终端显示文件内容带行号 cat -n test1.txt 4. 将标准输出与重定向运算符一起使用 cat t…

Android Q - 应用保活记录(展锐平台)

有其他同事改过这方面的问题&#xff0c;仅在此作个记录&#xff0c;方便查阅。 1、lmkd白名单 1).device/sprd/sharkle/common/lmkd_param.conf# format: title and string # TITLE_ for different usage # string detail information for every TITLE.####TITLE_LM…

rust-analyzer报错“Failed to spawn one or more proc-macro servers,....“怎么解决?

最近,在使用vscode测试rust代码时,遇到了一些问题。在经过反复折腾后,最终解决了问题,在此写下作为记录,以便于以后参考。 我遇到的报错内容是: Failed to spawn one or more proc-macro servers. cannot find proc-macro-srv, the workspace E:\100rust\temp is missin…

Timsort排序

Timsort 是一种混合排序算法&#xff0c;由 Tim Peters 在 2002 年为 Python 的标准库设计。它结合了归并排序&#xff08;Merge Sort&#xff09;和插入排序&#xff08;Insertion Sort&#xff09;的优点&#xff0c;特别适用于处理部分有序的数据集。Timsort 在 Python 中用…

目标检测YOLO实战应用案例100讲-【目标检测】基于图像处理的机器人垃圾分拣系统(续)

目录 3 基于YOLOv8的机器人垃圾分拣系统研究 3.1 引言 3.2 基于YOLOv8的机器人垃圾分拣系统设计方案

阿俊带你用Kotlin刷算法(五)

本系列通过Java和Kotlin这两种语言来解决力扣上面的算法题&#xff0c;由于本人算法菜鸟一枚&#xff0c;可能部分题目并不是最优题解&#xff0c;希望能和各位大神共同讨论~ 阿俊带你用Kotlin刷算法&#xff08;一&#xff09; 阿俊带你用Kotlin刷算法&#xff08;二&#x…

瑞芯微第二代8nm高性能AIOT平台 RK3576 详细介绍

RK3576处理器 RK3576瑞芯微第二代8nm高性能AIOT平台&#xff0c;它集成了独立的6TOPS&#xff08;Tera Operations Per Second&#xff0c;每秒万亿次操作&#xff09;NPU&#xff08;神经网络处理单元&#xff09;&#xff0c;用于处理人工智能相关的任务。此外&#xff0c;R…