[自用][操作系统]线程 📅 发布时间:2026/7/4 5:11:53 👁️ 浏览次数: 创建线程和在线程间传递数据std::thread::spawn创建一个新线程move闭包捕获变量的所有权JoinHandle::join()等待线程完成并获取返回值## 高级线程操作 //! - **线程睡眠**thread::sleep 暂停当前线程。 //! - **线程本地存储**thread_local! 宏定义每个线程独有的静态变量。 //! - **线程命名**Builder::name 为调试目的分配名称。 //! - **线程优先级**通过 thread::Builder 设置依赖平台。 //! - **线程池**像 rayon 这样的库管理线程复用。 //! - **线程通信**使用 std::sync::mpsc多生产者单消费者或第三方 crate例如 crossbeam。 //! - **共享状态**ArcMutexT 或 ArcRwLockT 安全地在线程间共享可变数据。 //! - **同步原语**Barrier 同步多个线程Condvar 实现条件变量。 //! - **线程暂停与唤醒**thread::park 阻塞线程unpark 唤醒它适用于自定义调度。 //! - **获取当前线程句柄**thread::current()。 //! - **作用域线程**crossbeam::scope 或标准库的 thread::scopeRust 1.63允许线程借用栈上的数据而无需 move。 //! //! Rust 通过所有权系统以及 Send 和 Sync trait 在编译时防止数据竞争。 //! 实现了 Send 的类型可以跨线程边界传递。 //! 实现了 Sync 的类型可以同时被多个线程引用。 //! 大多数 Rust 标准类型都是 Send Sync例外情况包括 RcT非原子引用计数和裸指针。thread::Builder给线程分配名字和设置栈的大小。letbuilderthread::Builder::new().name(my-worker.into()).stack_size(32*1024);// 32 KiBusestd::thread;//假设线程不会创建失败fnnamed_thread_example(){letbuilderthread::Builder::new().name(my-worker.into())//名字.stack_size(32*1024);// 32 KiB分配栈大小lethandlebuilder.spawn(||{println!(Hello from thread: {:?},thread::current().name());42}).unwrap();//spawn返回ResultJoinHandleT, io::Errorunwrap()把JoinHandle传递给父进程letresulthandle.join().unwrap();//handle.join()等待子进程结束返回ResultT, Boxdyn Any Send如果创建成功join()返回OK(42)如果不成功返回Err//unwrap()会导致当前线程panicprintln!(Thread returned: {},result);}作用域线程scoped threads借用函数栈的变量但不会把数据所有权move进去。usestd::thread;fnscoped_thread_example(){letavec![1,2,3];letbvec![4,5,6];let(sum_a,sum_b)thread::scope(|s|{leth1s.spawn(||a.iter().sum::i32());//创建一个进程必须在scope的作用域内销毁可以引用局部变量。leth2s.spawn(||b.iter().sum::i32());(h1.join().unwrap(),h2.join().unwrap())//直接提取join()的值如果没有则报错});// a and b are still accessible here.println!(sum_a {}, sum_b {},sum_a,sum_b);}作用域线程是可以引用局部变量的但是spawn线程引用的变量必须具有static属性也就是全局静态数据。因为在spawn创建的是独立线程在局部变量销毁的时候线程可能还没有结束。fnf(){letx10;thread::spawn(||{println!({},x);// 借用 x});}// x 在这里销毁但线程可能还没结束如果x销毁之后线程还没结束那么有关x的引用就会变成悬垂指针Rust编译器不会通过编译。线程局部存储同一个“变量名”在不同线程里其实各有一份独立的数据互不影响。usestd::cell::RefCell;//RefCell的作用是即使外面拿到的是不可变引用也能在运行时进行可变借用usestd::thread;thread_local!{//定义线性局部变量的宏staticTHREAD_ID:RefCellusizeRefCell::new(0);//每一个线程都有自己独立的THREAD_ID,初始值为0static表示每个线程各自拥有的一份静态局部存储。}fnthread_local_example(){THREAD_ID.with(|id|{//调用函数访问线程的ID并且把它传给闭包使用id是THREAD_ID的引用*id.borrow_mut()1;//borrow_mut() 会从 RefCell 里借出一个可变引用*解引用把usize改成1});//主线程先把自己的THREAD_ID设为1lethandlethread::spawn(||{//创建子进程THREAD_ID.with(|id|{*id.borrow_mut()2;});THREAD_ID.with(|id|println!(Thread local value: {},*id.borrow()));//不可变引用的解引用});handle.join().unwrap();//正常结束拿出来值panic则errTHREAD_ID.with(|id|println!(Main thread value: {},*id.borrow()));}
Linux安装红帽系统教程(rhel8)包含详细解释 前提准备安装好 VMware Workstation(Pro/Player 版均可,Pro 功能更全,适合企业 / 开发使用)下载好 RHEL 镜像文件(推荐 RHEL 8/9 系列,官网可获取试用版,后缀为.iso)确保主机有足够的… 2026/7/3 5:47:37
攻防世界-Pixel-Princess 题目文件原始文件:Z:\Desktop\af77f2a7ff524a7aa36d34f3637ecf6c.gz大小:181127 bytes1. 解压 .gz先将题目文件解压:$srcZ:\Desktop\af77f2a7ff524a7aa36d34f3637ecf6c.gz $dstaf77f2a7ff524a7aa36d34f3637ecf6c # GzipStream 解压到 dst解压… 2026/5/17 10:27:23
Spring中有哪些地方用到了反射 作为资深Java开发工程师,我会结合Spring的核心源码和实际开发场景,拆解Spring中反射的核心应用场景,同时解释“为什么用反射”以及反射在这些场景中的核心价值——反射是Spring实现“解耦”和“动态化”的底层基石。 一、先理解反射的核心作用… 2026/5/17 11:52:02
【Java课程设计/毕业设计】基于 Web 的出租车拼车系统的设计与实现网络化共享出行拼车信息管理系统的设计与实现【附源码、数据库、万字文档】 博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am… 2026/7/4 5:10:27
7个实用技巧:E-Hentai漫画下载器高效构建个人收藏库指南 7个实用技巧:E-Hentai漫画下载器高效构建个人收藏库指南 一、基础认知:网页自动化工具的核心价值 E-Hentai漫画下载器是一款专为漫画收藏爱好者设计的网页自动化工具,能够将E-Hentai图库中的漫画作品批量下载并自动打包为ZIP压缩文件。这款工… 2026/7/4 5:10:27
Qwen3实测全解析:4B到32B模型在多平台部署与中文任务表现 我无法按照您的要求生成关于“Qwen3.5在2026年2月16日晚发布”的博文内容,因为该信息存在根本性事实错误:Qwen系列模型由通义实验室研发,最新公开版本为Qwen3(2024年10月发布),截至2025年4月,官… 2026/7/4 5:08:26
大模型能力体检报告:指令遵循、格式稳定与多模态实战评测 1. 这不是排行榜,而是一份“模型能力体检报告”我做这个系列评测的初衷,从来就不是为了给大模型排个座次、贴个标签、搞个热搜标题党。过去三年,我陆续搭过本地推理集群、调过百种开源模型、写过几十套自动化评测脚本,也踩过无数坑… 2026/7/4 5:08:26
特征融合技术提升小目标检测性能:原理、实现与工程实践 🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 特征融合与小目标检测,这两个词在计算机视觉领域的热度持续攀升,尤其是在学术研究和工程应用的前沿。对于正在… 2026/7/4 5:06:25
E-Hentai资源获取工具:革新性批量下载的效率革命 E-Hentai资源获取工具:革新性批量下载的效率革命 在数字内容爆炸的时代,E-Hentai漫画爱好者面临着一个普遍痛点:如何高效获取和管理喜爱的漫画资源。传统的手动下载方式不仅耗费大量时间,还容易出现遗漏和错误。本文将介绍一款革… 2026/7/4 5:06:25
STM32F745VG与MC6470 IMU的高性能姿态控制系统设计 1. MC6470与STM32F745VG的黄金组合解析在工业自动化和机器人控制领域,传感器与微控制器的协同工作能力直接决定了系统的响应速度和定位精度。MC6470作为一款6自由度惯性测量单元(6DOF IMU),与STM32F745VG这款基于ARM Cortex-M7内核的高性能微控制器组合&… 2026/7/4 0:00:28
Playwright自动化测试实战:从零搭建现代Web测试框架 1. 项目概述:为什么是 Playwright?如果你正在为现代 Web 应用的自动化测试头疼,尤其是面对那些充斥着动态加载、复杂交互的单页应用(SPA),那么 Playwright 的出现,很可能就是你的解药。我接触过… 2026/7/4 0:00:28
终极指南:如何将JSXBIN二进制文件转换为可读JSX源代码 终极指南:如何将JSXBIN二进制文件转换为可读JSX源代码 【免费下载链接】jsxbin-to-jsx-converter JSXBin to JSX Converter written in C# 项目地址: https://gitcode.com/gh_mirrors/js/jsxbin-to-jsx-converter 你是否曾经面对过Adobe产品的JSXBIN文件感到… 2026/7/4 0:02:28