gpt4 book ai didi

rust - 如何在不复制的情况下将 `str` 借给线程?

转载 作者:行者123 更新时间:2023-11-29 08:10:57 26 4
gpt4 key购买 nike

给定

fn greet(peeps: &str) {
println!("Hello, {}", peeps);
}

我能做到:

fn main() {
let a = "World";
thread::spawn(move || greet(a)).join().unwrap();
}

编译器知道线程的生命周期不会比借用的字符串长,但这只是当 &str 的生命周期已知为 'static 时的特例。当我尝试对函数参数执行相同操作时,它无法编译:

fn indirect(peeps: &str) {
thread::spawn(move || greet(&peeps)).join().unwrap();
// Does not compile, for fear that the thread may outlive peeps
}

但是,对于人类读者来说,线程显然不能比借用的字符串存活得更久。

我找到了两个解决方法:

  1. 制作一个字符串的副本,可以将其移动到线程中:

    fn indirect(peeps: &str) {
    let peeps = peeps.to_string();
    thread::spawn(move || greet(&peeps)).join().unwrap();
    }
  2. 或者,利用著名的弃用 thread::scoped:

    #![feature(scoped)]
    fn indirect_scoped(peeps: &str) {
    thread::scoped(move || greet(&peeps)).join();
    }

我不想为函数参数指定 'static 生命周期,我不希望进行不必要的复制(解决方法 1)并且我不希望使用已弃用的功能(解决方法 2).

遇到这种情况我该怎么办?

最佳答案

scoped() 方法是将借用数据传递给子线程的正确方法。虽然 thread::scoped() 本身由于其不可靠而被弃用,但有一个替代的声音 API,如 crossbeamscoped_threadpool提供一种在稳定的 Rust 上执行此操作的方法:

extern crate crossbeam;

fn indirect(peeps: &str) {
crossbeam::scope(|scope| {
scope.spawn(|| greet(peeps));
});
}

关于rust - 如何在不复制的情况下将 `str` 借给线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33494959/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com