rust 多个线程可以共享 * 临时 * 不可变的非静态数据吗?[duplicate]

mftmpeh8  于 2023-03-02  发布在  其他
关注(0)|答案(1)|浏览(83)

此问题在此处已有答案

How can I pass a reference to a stack variable to a thread?(1个答案)
2天前关闭。
多个线程可以共享 * 临时 * 不可变的非静态数据(当线程运行时)吗?
例如,以下代码给出错误:
错误[E0621]:v类型中需要显式生存期(第4行)

use std::sync::Arc;
use std::thread;

fn f(v : &Vec<i64>)
{
    let n = v.len();
    let a = Arc::new(v);
    let mut ts = Vec::new();

    for i in 0..n
    {
        let a_clone = a.clone();

        let t = thread::spawn(move ||
        {
            println!("thread {}, v[{}] = {}", i, i, a_clone[i]);
        });

        ts.push(t);
    }

    for t in ts
    {
        t.join().unwrap();
    }
}

fn g()
{
    let mut v : Vec<i64> = vec![1, 2, 3, 4, 5];
    f(&v);
    v.push(6);
    dbg!(v);
}

fn main()
{
    g();
}

我能按摩一下使它起作用吗?

ulydmbyx

ulydmbyx1#

我能按摩一下使它起作用吗?
是的,秘密在于thread::scope,它不要求闭包捕获的数据是'static,因为它保证了当作用域结束时所有线程都结束了:

use std::thread;

fn f(v: &[i64]) {
    let n = v.len();
    
    thread::scope(|s| {
        for i in 0..n {
            s.spawn(move || {
                println!("thread {}, v[{}] = {}", i, i, v[i]);    
            });
        }
    });
}

fn g() {
    let mut v = vec![1, 2, 3, 4, 5];
    f(&v);
    v.push(6);
    dbg!(v);
}

fn main() {
    g();
}

Playground.

相关问题