【问题标题】:Extend lifetime of a variable for thread延长线程变量的生命周期
【发布时间】:2015-07-31 13:56:03
【问题描述】:

我正在从文件中读取一个字符串,将其按行拆分为一个向量,然后我想在单独的线程中对提取的行做一些事情。像这样:

use std::fs::File;
use std::io::prelude::*;
use std::thread;
fn main() {
    match File::open("data") {
        Ok(mut result) => {
            let mut s = String::new();
            result.read_to_string(&mut s);
            let k : Vec<_> = s.split("\n").collect();
            for line in k {
                thread::spawn(move || {
                    println!("nL: {:?}", line);
                });
            }

        }
        Err(err) => {
            println!("Error {:?}",err);
        }
    }
}

当然这会引发错误,因为s 在线程启动之前会超出范围:

s` does not live long enough
main.rs:9           let k : Vec<_> = s.split("\n").collect();
                                     ^

我现在能做什么?我已经尝试了很多东西,比如BoxArc,但我无法让它工作。我不知何故需要创建一个s 的副本,它也存在于线程中。但是我该怎么做呢?

【问题讨论】:

    标签: multithreading rust lifetime


    【解决方案1】:

    从根本上说,问题在于lines 的借用切片。在这里您真的无能为力,因为无法保证每个line 不会比s 本身寿命长。

    另外,要明确一点:Rust 中绝对没有办法“延长变量的生命周期”。根本做不到。

    解决此问题的最简单方法是从line借用 变为拥有。像这样:

    use std::thread;
    fn main() {
        let mut s: String = "One\nTwo\nThree\n".into();
        let k : Vec<String> = s.split("\n").map(|s| s.into()).collect();
        for line in k {
            thread::spawn(move || {
                println!("nL: {:?}", line);
            });
        }
    }
    

    .map(|s| s.into())&amp;str 转换为String。由于 String 拥有其内容,因此可以安全地将其移入每个线程的闭包中,并且将独立于创建它的线程而存在。

    注意:您可以使用新的作用域线程 API 在夜间 Rust 中执行此操作,但这仍然不稳定。

    【讨论】:

      猜你喜欢
      • 2015-05-03
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多