rust里使用thread_local!

Rust + Tauri调用鸿蒙系统原生API,打通桥接实战经验总结 真不容易啊,网上这方面资料很少,探索尝试了很久终于打通了调用鸿蒙原生API的方法。这有什么用?使用Tauri做跨端APP是个不错的技术方案,可以一次可以跨N端。但是呢肯定避免不了依赖和使用系统的原生API来扩展能力。当前Tauri在android和ios端,官方都有插件支持。但鸿蒙还不支持,有待探索。正在(或即将)把 Tauri 应用往鸿蒙(HarmonyOS)上搬、想调用系统原生能力(相册、分享、通知、剪贴板……)的开发者。本文是一篇实战记录,不是官方文档复述。 阅读详情

thread_local使用很简单,只需要使用这个宏就可以了,不需要任何的use,但是释放资源的时候一定要注意,用std::ops::Drop自动释放是不可行的

下面的代码的Drop是不可行的:

use std::ops::Drop;

struct Foo;

impl Foo{
    fn print(&self){
        println!("print foo");
    }

    //fn drop(&self){
    //    println!("drop foo");
    //}
}

thread_local!(static F:Foo = Foo);

impl Drop for Foo{
    fn drop(&mut self){
        println!("drop");
    }
}

fn main(){
    F.with(move|f:&Foo|{
        f.print();
    });
    println!("exit");
}

编译正常,执行结果出错,提示的大致意思就是不能在thread_local销毁以后再去访问他

print foo
exit
thread '<main>' panicked at 'cannot access a TLS value during or after it is destroyed', ../src/libcore/option.rs:330
fatal runtime error: Could not unwind stack, error = 5
playpen: application terminated abnormally with signal 4 (Illegal instruction)

既然Drop自动释放不可行,那么只能自己手动释放thread_local包含的资源了,下面代码是可行的:

struct Foo;

impl Foo{
    fn print(&self){
        println!("print foo");
    }

    //为了方便就用了immutable borrow,否则main最后面调用f.drop()过不去
    //如果确实需要mutable borrow的需要给Foo类型加个RefCell来包装下,访问的时候borrow_mut()就可以
    fn drop(&self){
        println!("drop foo");
    }
}

thread_local!(static F:Foo = Foo);

fn main(){
    F.with(move|f:&Foo|{
        f.print();
    });

    F.with(|f|{
        f.drop();
    });

    println!("exit");
}

这儿是可运行的版本,play地址:http://is.gd/AsQKMA
运行结果:

print foo
drop foo
exit

使用thread_local!的时候注意用xxx.with(|xx|{})的方式来访问,具体看main里的使用方法,比如这个例子里的变量F其实不是Foo类型,他被thread_local包装过了

我们可以直接调用F.print();来看看编译器提示:

<anon>:28:7: 28:14 error: no method named `print` found for type `std::thread::local::LocalKey<Foo>` in the current scope
<anon>:28     F.print();
                ^~~~~~~
error: aborting due to previous error
playpen: application terminated with error code 101

可以明显看到F是std::thread::local::LocalKey<Foo>类型

文档里的例子就是用的RefCell又包装了一层,需要的可以看看:
https://doc.rust-lang.org/std/thread/struct.LocalKey.html

【Bug已解决】Fast (Rust-backed) tokenizers aren‘t thread-safe anymore 解决方案 在多线程(不是多进程)环境下复用同一个 HuggingFacetokenizers最迷惑的是:这曾经"没问题",某个tokenizers版本升级后突然开始出错——也就是标题里说的 "aren't thread-safe很多项目在升级依赖后训练静默变差,根子就在 tokenizer 的线程安全回归。RefCell。 阅读详情

相关推荐

thread_local-rs:Rust的按对象线程本地存储

thread_local 该库提供ThreadLocal类型,该类型允许将每个对象的单独对象副本使用。 与标准库的thread_local!不同,这允许按对象进行线程本地存储thread_local! 宏,仅允许静态本地线程存储。 用法 将此添加到您的Cargo.toml : [ dependencies ] thread_local = " 1.1 " 最低Rust版本 该板条箱的最低支持Rust版本(MSRV)为1.36.0。 执照 根据以下任一许可 Apache许可证2.0版( 或 ) MIT许可证( 或 ) 由您选择。 贡献 除非您明确声明,否则您有意提交以供您包含在工作中的任何贡献(按照Apache-2.0许可的定义)均应如上所述获得双重许可,且无任何其他条款或条件。

Rust开发——Rust开发中thread_local

在 Rust 中,thread_local 宏用于创建线程本地存储,允许每个线程都拥有其独立的副本,这与所有权概念有所不同。 所有权(Ownership)是 Rust 中的一个核心概念,它用于管理内存的分配和释放,确保在编译时避免出现数据竞争、悬垂指针和多线程安全问题。所有权规则强制确保每个值都只有一个所有者,并通过移动、借用和生命周期来管理值的传递和使用。

知来者逆的博客 1751

rust-threadpool, 用于并行任务执行的非常简单的线程池.zip

rust-threadpool, 用于并行任务执行的非常简单的线程池 线程管理线程池,用于在一组固定工作线程上运行许多作业。 用法将这个添加到你的Cargo.toml:[dependencies]threadpool = "1.0"这是你的箱子 root:extern c

rust实战系列一百六十四:线程局部存储

Mutex/RwLock在加锁的时候返回的是Result类型,是因为它。(2)RefCell是非线程安全的,它不能在跨线程场景使用。声明的变量,使用的时候要用with()方法加闭包来完成。与它相对应的线程安全版本。panic,导致Mutex内部的数据已经被破坏,而在另外一个线程中依然有可能观察到。线程局部(Thread Local)的意思是,声明的这个变量看起来是一个变量,但。这既提供了完整的功能,又避免了数据竞争一类的bug。正因为在“内存安全”问题上的一系列基础性设计,才导致了“线程安全”基本就。

Mr_Roki的博客 789

常微分方程 (ODE) 和 随机微分方程 (SDE)

常微分方程(Ordinary Differential Equations, ODE)和随机微分方程(Stochastic Differential Equations, SDE)是数学中描述系统动态行为的重要工具。它们有一些相似之处,但在处理随机性方面存在显著差异。

weixin_39699362的博客 4384

Gephi新手必看:如何用Excel整理CSV数据快速生成网络图(附模板)

本文为Gephi新手提供了一份从Excel数据整理到生成专业网络图的完整指南。详细讲解了如何构建规范的节点表和边表CSV文件,并导入Gephi进行可视化分析。通过实战案例,帮助读者快速掌握利用Excel整理数据、规避常见错误,并运用布局算法与视觉编码,将复杂关系数据转化为直观的网络洞察。

weixin_28487433的博客 389

rust 多线程

本文介绍了使用rust使用多线程的一些知识,包括线程并发,消息传递,锁等方法的使用

个人博客,记录了本人学习的各种有趣的技术。 448

告别手动连接!一键搞定Mumu模拟器与Android Studio的ADB配置

本文详细介绍了如何通过编写自动化脚本,一键完成Mumu模拟器与Android Studio的ADB连接配置。告别繁琐的手动命令输入,该脚本能智能检查环境、判断连接状态并自动处理端口转发,显著提升Android开发者的调试与测试效率。

yog99的博客 495

开源项目推荐:thread_local-rs

开源项目推荐:thread_local-rs 项目基础介绍和主要编程语言 thread_local-rs 是一个用 Rust 编程语言编写的开源项目。Rust 是一种系统编程语言,以其内存安全和高性能著称。该项目的主要目标是提供一种线程局部存储(Thread Local Storage, TLS)的实现,允许每个线程拥有对象的独立副本。 项目核心功能 thread_local-rs 的核心功能是提...

gitblog_00799的博客 431

SV--对象拷贝、参数化的类

对象拷贝,参数化的类

创芯人--fly的博客 1569

ADS新手必看:ICCAP数据导入与导出CSV的完整流程(附常见问题解决)

本文为ADS新手详细讲解了如何将ICCAP测试数据导入ADS进行仿真分析,并导出为通用CSV格式的完整流程。内容涵盖文件格式解析、导入设置、数据验证、处理技巧及常见问题排查,重点解决了数据文件导入过程中的兼容性与单位映射等核心难点,帮助射频工程师高效连接测量与仿真环节。

peace的博客 557

Crossbeam Utils的Thread Local:线程局部存储的高效使用

Thread Local(线程局部存储)是一种特殊的变量存储方式,它允许每个线程拥有该变量的独立实例。这意味着当多个线程访问同一个Thread Local变量时,它们实际上是在操作各自线程内的副本,互不干扰。这种机制非常适合存储线程私有数据,避免了多线程环境下的数据竞争和同步问题。 ## 为什么需要Thread Local 在并发编程中,传统的共享变量需要使用锁等同步机制来保证线程安全,这不仅会...

gitblog_00348的博客 277

基于转录逆转的药物重定向 GPS 模型

GPS是一个基于分子结构预测基因表达扰动的开源平台,由三个模块组成:RCL(在LINCS扰动数据上训练抗噪MLP)、GPS4Drugs(预测新化合物的基因表达谱并进行逆转评分)、MolSearch(基于MCTS的分子优化)。平台使用Morgan指纹和Gene Ontology注释作为特征输入,将基因表达扰动离散为三分类标签。训练数据来自LINCS Phase I的18,746个化合物和978个landmark基因,支持四细胞系独立训练,可用于药物重定向与化合物筛选。

听雨草堂 82

揭秘local.ai架构:Rust后端如何实现高效本地AI推理

local.ai是一款革命性的本地AI运行工具,它通过高效的Rust后端架构,让普通用户也能在个人电脑上轻松运行AI模型。本文将深入剖析local.ai的技术架构,重点介绍Rust后端如何实现高性能的本地AI推理,为你揭开本地AI应用的神秘面纱。 ## 🚀 为什么选择Rust构建本地AI后端? 在探讨local.ai的架构之前,我们首先需要了解为什么选择Rust作为后端开发语言。Rust以其

gitblog_00389的博客 792

YOLO11 Backbone改进:二值化、三值化权重实战(一)

本文介绍了二值化/三值化神经网络的基本概念、优势挑战及应用场景。二值化网络将权重限制为±1,三值化则增加0值,显著减少模型存储需求和计算复杂度。虽然存在精度下降等挑战,但通过技术改进已能在移动设备、自动驾驶等领域应用。文章分析了YOLO11中适合量化的层,并详细阐述了二值化权重原理及Straight-Through Estimator等关键技术。二值化/三值化神经网络为资源受限设备提供了高效的深度学习解决方案。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 298

绘制Winform动态折线图,LiveCharts如何打造数据可视化神器?

在C# Winform应用程序中,使用LiveCharts库来创建动态、美观的折线图不仅能够提升用户体验,还能直观展示数据趋势。下面,我们将通过一个详尽的示例,展示如何在Winform项目中集成LiveCharts并绘制折线图。:在Visual Studio中,选择“文件” > “新建” > “项目”,然后选择“Windows Forms 应用(.NET)”模板。LiveCharts的强大之处在于其高度的可定制性,你可以根据需求调整颜色、动画效果、交互方式等,让图表更加符合你的应用需求。

java专栏 1683

local.ai开发者指南:Rust SDK与JavaScript API全解析

local.ai是一款能够让你在个人电脑上本地运行AI模型的强大工具。本指南将详细解析其Rust SDK与JavaScript API,帮助开发者快速上手并构建基于本地AI的应用。 ## 一、local.ai简介 local.ai提供了一个直观的界面,让用户可以轻松地与本地AI模型进行交互。无论是进行对话、获取信息还是完成特定任务,local.ai都能满足你的需求。 [![local.ai对

gitblog_00811的博客 942

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

ShareX 截图工具免费完整教程:从安装到一键长图,只要 5 分钟

报错截图里还留着客户账号,长网页一屏装不下,发给同事前还得手动修一圈——这些琐事每天都在偷走你的时间。ShareX 截图工具是一款免费开源的 Windows 屏幕捕捉与文件分享工具:按一个快捷键捕捉屏幕任意区域,捕捉后直接标注、打码、保存或上传,全程不切换应用。 ## 为什么选 ShareX:截图、打码、上传不用换工具 - **捕捉、编辑、分享分散在好几个工具里?** ShareX 把区域捕捉

gitblog_00274的博客 171

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

douyin-downloader:把整个抖音主页归档下来的批量下载工具

douyin-downloader 是用 Python 编写的抖音作品批量抓取工具,面向三类典型需求:完整归档一个博主的主页、周期性的增量抓取、以及把下载动作嵌进脚本或外部任务系统。粘贴主页链接后它会按分页拉取作品列表,落盘结果去水印,配合本地 SQLite 记录实现去重,缺文件时下一轮自动补齐——重复运行不会把磁盘填两遍。下文给出最短跑通路径、关键前置条件、内部机制,以及失败时该先查什么。 #

gitblog_00682的博客 344

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Rust - RFC 3642 thread_spawn_hook

摘要:Rust RFC #3642 提出新增 std::thread::add_spawn_hook 接口,允许注册线程生成钩子,实现线程局部变量的跨线程继承。该功能适用于测试框架等场景,解决子线程无法访问父线程状态的问题。钩子按添加顺序逆序执行,仅影响当前线程及其子线程。接口设计为泛型函数,避免全局副作用,并通过 Builder::no_hooks 支持选择性禁用。缺点包括内存分配开销和需提前注册,但相比线程创建成本可忽略。替代方案(如全局钩子或语言特性)因复杂性被否决。未来可能集成至 libtest 改

748

使用指南:thread_local-rs 开源项目探索

使用指南:thread_local-rs 开源项目探索 1. 项目目录结构及介绍 thread_local-rs 是一个实现 Rust 语言中对象级线程局部存储的库。其目录结构设计简洁明了,支持高效的开发和维护。下面是其核心结构概览: thread_local-rs/ │ ├── benches/ # 性能测试基准代码 ├── src/ # 核心...

gitblog_00785的博客 306

Rust 编译器错误 E0712 深度解析:线程局部变量的借用为何不能越过函数边界

本文围绕 rustc 错误码 **E0712(thread-local variable borrowed past end of function)** 展开,结合当前仓库中该错误码的官方说明文档与 borrowck(借用检查器)源码实现,完整还原这一错误的触发场景、底层原理与修复方案。读完本文后,你将能够准确识别 `#[thread_local]` 与 `thread_local!` 变量的借

gitblog_00704的博客 918

如何在 Tokio 多线程运行时中用 task::LocalSet 运行 !Send 的 future

在 Tokio 的多线程运行时里,`tokio::spawn` 要求传入的 future 实现 `Send`。当你的代码持有 `Rc`、`RefCell` 这类不能跨线程共享的类型,并且不想把它改写成 `Arc`/`Mutex` 时,可以直接 spawn 的写法编译不过。Tokio 为此提供了 `task::LocalSet`:它是一个运行在单个线程上的本地任务集合,可以在 `multi_thre

gitblog_00481的博客 403

开源项目 `thread_local-rs` 常见问题解决方案

开源项目 thread_local-rs 常见问题解决方案 项目基础介绍 thread_local-rs 是一个用于 Rust 编程语言的开源项目,旨在提供线程局部存储(Thread Local Storage, TLS)功能。与 Rust 标准库中的 thread_local! 宏不同,thread_local-rs 允许每个对象拥有独立的线程局部存储,而不是仅限于静态线程局部存储。这使得开发者...

gitblog_00890的博客 740

Rust 1.93更新musl库增强网络功能

Rust 1.93更新musl库增强网络功能

至顶AI实验室 393

OpenMMO如何让Rust代码跑在浏览器里?WASM编译实践指南

OpenMMO 是一款在浏览器中直接运行的 3D 多人在线角色扮演(MMO)游戏:Rust 编写的服务端与共享逻辑,Svelte + WebGPU 的前端。本文将拆解它如何用 WebAssembly(WASM)把 Rust 代码编译进浏览器——包括共享 crate 设计、wasm-pack 构建流水线与 Vite 集成,帮你快速掌握「Rust 进浏览器」的完整实践路径。 [![OpenMMO游戏

gitblog_00264的博客 797
上一篇: rust条件编译
下一篇: rust raw pointer使用方法(3)
varding
博客等级 码龄17年 115粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值