此问题在此处已有答案:
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();
}
我能按摩一下使它起作用吗?
1条答案
按热度按时间ulydmbyx1#
我能按摩一下使它起作用吗?
是的,秘密在于
thread::scope
,它不要求闭包捕获的数据是'static
,因为它保证了当作用域结束时所有线程都结束了:Playground.