生锈的终身问题:借来的价值寿命不够长

2023-12-05

我在下面的简短代码中重现了我的问题。

Problem: The inner thread使用变量的引用v来自outer thread。 rust 编译器会抛出错误,因为“技术上”outer thread可以在之前终止inner thread因此inner thread可能会失去对变量的访问v。然而在下面的代码中,这显然不可能发生。

Question:我该如何更改此代码,使其符合要求,同时保持相同的功能?

fn main() { //outer thread
    let v = vec![0, 1];
    let test = Test { v: &v }; //inner_thread
    std::thread::spawn(move || test.print());
    loop {
        // this thread will never die because it will never leave this loop
    }
}

pub struct Test<'a> {
    v: &'a Vec<u32>,
}

impl<'a> Test<'a> {
    fn print(&self) {
        println!("{:?}", self.v);
    }
}
error[E0597]: `v` does not live long enough
 --> src/main.rs:3:26
  |
3 |     let test = Test { v: &v }; //inner_thread
  |                          ^^ borrowed value does not live long enough
4 |     std::thread::spawn(move || test.print());
  |     ---------------------------------------- argument requires that `v` is borrowed for `'static`
...
8 | }
  | - `v` dropped here while still borrowed

显而易见的解决方案是让 Test 拥有该向量,而不仅仅是拥有一个引用。

但是如果你确实需要借用线程中的值(可能是因为你想在执行结束后使用它),那么你可以使用横梁范围:

let v = vec![0, 1];
let test = Test { v: &v }; //inner_thread
crossbeam::thread::scope(|scope| {
    scope.spawn(|_| test.print());
}).unwrap();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

生锈的终身问题:借来的价值寿命不够长 的相关文章

  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 如何过滤自定义结构体的向量?

    我正在尝试过滤Vec
  • 使用 Thread.Sleep 等待的替代方法

    首先我不是在问同样的问题C Thread Sleep 的替代方案 https stackoverflow com questions 5450353 c sharp alternative to thread sleep or C 中 Th
  • Spring Batch 多线程 - 如何使每个线程读取唯一的记录?

    这个问题在很多论坛上都被问过很多次了 但我没有看到适合我的答案 我正在尝试在我的 Spring Batch 实现中实现多线程步骤 有一个包含 100k 条记录的临时表 想要在 10 个线程中处理它 每个线程的提交间隔为 300 因此在任何时
  • asp.net core / kestrel中的线程管理

    我正在解决我们已迁移到 asp net core 2 0 的 asp net 应用程序的性能 可扩展性问题 我们的应用程序作为应用程序服务托管在 azure 上 并且在任何中等流量的情况下都很容易崩溃 让我困惑的一件事是如何处理多个并发请求
  • 无锁算法真的比全锁算法性能更好吗?

    陈雷蒙德 http blogs msdn com b oldnewthing 一直在做一个huge http blogs msdn com b oldnewthing archive 2011 04 15 10154245 aspx ser
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • 如何复制文件并具有取消复制的功能?

    我正在努力拥有program能够取消复制 因此我不能使用Microsoft VisualBasic FileIO FileSystem CopyFile 有一些包装用于CopyFileEx在网络上 例如here http msdn micr
  • 使用多线程使用rabbitmq消息队列(Python Kombu)

    我有一个带有单个队列的 RabbitMQ 交换 我希望创建一个运行多个线程并尽快通过该队列工作的守护进程 工作 涉及与外部服务的通信 因此每个消费者内部都会发生相当多的阻塞 因此 我希望有多个线程都处理来自同一队列的消息 我可以通过在主线程
  • 使用ftplib进行多线程上传

    我正在尝试进行多线程上传 但出现错误 我猜想也许不可能在 ftplib 中使用多线程 这是我的代码 class myThread threading Thread def init self threadID src counter ima
  • Java-线程与CPU的关系

    我对多线程还很陌生 我正在开发一个项目 尝试在我的 Java 程序中使用 4 个 CPU 我想做类似的事情 int numProcessors Runtime getRuntime availableProcessors ExecutorS
  • JavaFX Platform.runLater 的使用以及从不同线程访问 UI

    我有几个问题Platform runLater 我有一个 JavaFX 应用程序类 在这个类中 我运行一个线程 该线程从网络套接字读取数据 现在当我创建一个新的Stage在线程内部 系统抛出异常 JavaFX 事件调度程序线程和我的网络读取
  • 如何在其他核心上运行每个线程?

    我有一个 udp 服务器接收数据并计算它 每个角色我都有两个线程 我的CPU是8个多核 我以不同的速度发送数据 但最多我只使用了 cpu 两核 50 的 14 如果我发送更多的数据值 我的缓冲区将填满并且不会使用更多的CPU 为什么每个核心
  • 理解 C++11 中的 std::atomic::compare_exchange_weak()

    bool compare exchange weak T expected T val compare exchange weak 是 C 11 中提供的比较交换原语之一 它是weak即使对象的值等于 它也会返回 falseexpected
  • 比较和交换的工作原理

    我读过很多帖子说比较和交换保证原子性 但是我仍然不明白它是如何做到的 这是比较和交换的通用伪代码 int CAS int ptr int oldvalue int newvalue int temp ptr if ptr oldvalue
  • C# 中什么时候应该使用 volatile 关键字?

    谁能提供一个很好的解释volatile https learn microsoft com en us dotnet csharp language reference keywords volatileC 中的关键字 它解决了哪些问题 没
  • 返回“!”是什么意思?铁锈中的意思是什么?

    最近我在 Rust 中发现了一个返回的函数 而不是基本类型 如下所示 fn my function gt 这是什么意思 我无法在中找到有关此的信息锈迹斑斑的书 https doc rust lang org book 该函数使用此类指标返回

随机推荐

  • 如何在 JSF 中以编程方式设置区域设置

    我目前正在尝试以编程方式设置区域设置 但找不到好的解决方案 用例是我有另一个网站将数据发布到我的网站 该网站具有区域设置参数 并且基于此区域设置 我必须呈现我的页面 我已经尝试在 preRenderView 构造函数和 PostConstr
  • XLConnect 包可以与 Java 8 一起使用吗?

    我更新了 Java 版本并删除了旧版本的 Java 现在我的 XLConnect 包不会在 R 中加载 因为 XLConnectJars 不会加载 这是错误消息 Loading required package XLConnectJars
  • Opera 和 Internet Explorer 中的 JQuery 安全错误

    我正在开发一个适用于社交网络的应用程序 该应用程序适用于IFrame 该应用程序在 Google Chrome 和 Microsoft Firefox 浏览器中运行良好 但在 Opera 12 15 JQuery 库 v1 10 1 中无法
  • 通过 matplotlib 中的一个因子更改绘图比例

    我正在用 python 创建一个图 有没有办法按一个因子重新缩放轴 这yscale and xscale命令只允许我关闭对数刻度 Edit 例如 如果我有一个情节x尺度从 1 nm 到 50 nm x 尺度范围从 1x10 9 到 50x1
  • 使用 C void 参数“void foo(void)”更好还是不使用“void foo()”更好? [复制]

    这个问题在这里已经有答案了 什么是更好的 void foo or void foo void 对于 void 它看起来丑陋且不一致 但有人告诉我它很好 这是真的 编辑 我知道一些旧的编译器会做奇怪的事情 但如果我只使用 GCC 是void
  • 使用没有默认“名称”的 jquery TokenInput

    我尝试使用此处找到的 jquery tokeninput http loopj com jquery tokeninput 遵循 Railcast 的指南 http railscasts com episodes 258 token fie
  • 使用 IComparer 而不是 OrderBy 对字典列表进行排序

    以下是我的收集以及数据 var data new List
  • 克隆gitlab项目,使用git lfs,无需一直提供密码

    我决定在 gitlab 上尝试 git lfs 我注意到它不适用于 ssh 所以我决定使用 https 推送工作得很好 但是当我尝试克隆我的项目时 它要求我输入用户名和密码every file 这有点烦人 有什么解决方法吗 编辑2018 这
  • 绑定 DataGridTemplateColumn 可见性

    我试图将数据网格中列的可见性绑定到 ViewModel 中的布尔 DependencyProperty 在本例中设置为视图 UserControl 的数据上下文 由于某种原因 我似乎不明白 它不起作用 查看此处后 我发现 datagridt
  • 如何将 OleVariant 转换为 IDispatch 派生?

    今天我带来了另一个让我头疼的问题 我确实将 DAO 3 6 类型库导入到我的 delphi 7 中 并且我开始看到许多有趣的接口 因此我面临着有趣的问题 每次类 Fields 出现在另一个类的属性上时 它们都有正确的定义 我的意思是 他被定
  • 使用单个更新查询从深层嵌套数组中删除多个元素

    我有以下类型的文件 id ObjectId 5c05984246a0201286d4b57a f x a onlineStore p s a t id 1 dateP 20200 09 20 did x dst y den z
  • new操作分配的内存是连续的吗?

    正如标题所说 我想知道在c 中 一个new操作分配的内存是否是连续的 BYTE data new BYTE size 在此代码中 无论给定大小 返回的内存区域都是连续的 如果堆管理器无法分配连续的内存size 失败了 异常 或 NULLma
  • 断言语句在 C++ 中不起作用[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 在我的程序中使用断言时 我遇到了一个奇怪的问题 即使我添加一行代码 程序也不会终止assert false 但是assert当我编写几行示例代码时有效 有人知道为什么会发生吗 如果你
  • Terraform for-each 包含对象列表

    我在 Variables tf 文件中有以下变量 variable tenants description Map of project names to configuration type list object name string
  • 如何查找 SPFolder 中的项目计数?

    我有一个将项目存储在文件夹层次结构中的列表 我注意到SPFolder Files Count始终为零 有没有办法找出文件夹中有多少个列表项 我假设您正在寻找直接子项而不是后代 例如子文件夹中的项目 您是否还想在计数中包含子文件夹 在这种情况
  • 使用 Shiny 创建响应式 selectInput - flexdashboard

    我正在尝试在 Flexdashboard 文档中使用 Shiny 制作反应式 selectInput 我的第一次selectInput选择海洋公园中的区域类型 selectInput Zone label Marine Park Zonin
  • Windows PowerShell:更改命令提示符

    使用 Windows PowerShell 如何更改命令提示符 例如 默认提示是 PS C Documents and Settings govendes My Documents gt 我想自定义该字符串 只需将函数prompt在您的 P
  • 如何更改 pinax(0.9a2) 模板?

    我已经安装了带有 pinax bootstrap 主题的 pinax 0 9a2 现在我想自定义它并重新设计主题 但我在模板文件夹中没有找到任何 css 文件 那么如何自定义bootstrap主题的css呢 这就是我如何启动并运行我的基本
  • 按聚合动态列名匹配分组

    是否有可能group by使用 dplyr 对列名使用正则表达式匹配 library dplyr dplyr 0 5 0 R version 3 3 2 2016 10 31 dummy data set seed 1 df1 lt sam
  • 生锈的终身问题:借来的价值寿命不够长

    我在下面的简短代码中重现了我的问题 Problem The inner thread使用变量的引用v来自outer thread rust 编译器会抛出错误 因为 技术上 outer thread可以在之前终止inner thread因此i