结构S
实际上可能是一些大数据,例如大Vec
。如果我有一个线程并且在创建线程后不使用数据,我可以将数据移动到它,但是有两个线程(或在主线程中使用相同的数据),这是不可能的。
struct S {
i : i32,
}
fn thr(s : &S)
{
}
fn main()
{
let s1 = S { i:1 };
thr(&s1);
let t1 = std::thread::spawn(|| thr(&s1)); // does not work
let t2 = std::thread::spawn(|| thr(&s1)); // does not work
t1.join();
t2.join();
}
答案 0 :(得分:7)
我高度建议您阅读The Rust Programming Language,特别是chapter on concurrency。在其中,您将了解Arc
:
Arc
值得注意的是,当克隆is_intermediate = function(x) {
return(x < 85 & x > 15)
}
res = sapply(Data[, 2:length(Data)], is_intermediate)
rowSums(res)
时,它们只是碰撞引用计数,而不是复制包含的数据。
答案 1 :(得分:0)
如果这是C或C ++,分配的内存在显式释放之前不会消失,而且除非对象被声明为threadlocal,否则应用程序中的所有线程都可以引用它们。
在您编写的代码中,您的结构似乎是堆栈而不是堆,因此一旦超出范围,对象指针就无效。
在没有ARC的情况下处理这个问题的野蛮方法是简单地分配对象并将分配的指针传递给你的线程。有些线程需要最终删除它(这是ARC的好主意)。