结构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();
}

===============>>#1 票数:7

强烈建议阅读Rust编程语言 ,特别是有关并发性章节 在其中,您将了解Arc

use std::sync::Arc;

struct S {
    i: i32,
}

fn thr(s: &S) {}

fn main() {
    let s1 = Arc::new(S { i: 1 });
    thr(&s1);

    let s2 = s1.clone();
    let t2 = std::thread::spawn(move || thr(&s2));

    let s3 = s1.clone();
    let t3 = std::thread::spawn(move || thr(&s3));

    t2.join();
    t3.join();
}

值得注意的是,克隆Arc时,它们仅增加引用计数,而不复制包含的数据。

===============>>#2 票数:0

如果这是C或C ++,则分配的内存只有在显式释放后才会消失,而且,除非将对象声明为threadlocal,否则应用程序中的所有线程都可以引用它们。

在您编写的代码中,您的结构似乎在堆栈上而不是堆上,因此一旦超出范围,对象指针将无效。

在没有ARC的情况下,解决此问题的残酷方法是简单地分配对象并将已分配的指针传递给线程。 一些线程需要成为最终删除它的线程(这是ARC是个好主意)。

  ask by Gennady Proskurin translate from so

未解决问题?本站智能推荐:

1回复

是否可以在不进行任何克隆的情况下与线程共享数据?

当我将工作委派给线程时,我通常会拥有一段数据,这些数据将超过所有线程的寿命,例如以下示例中的numbers : 它没有在任何地方被修改,并且由于join的存在,可以确保使用它完成线程。 但是,Rust的借阅检查器无法判断: error[E0373]: closure may outl
1回复

将向量复制到线程

考虑以下代码,我希望在我的线程中同时访问client和requests ,但目前我还没有权限: 我收到以下编译器错误: 。
1回复

如何将非静态数据发送到Rust中的线程,在此示例中是否需要?

我正在尝试使用Rust中的一些堆数据来启动一个新线程,并且我收到一堆错误,这些错误源于对数据具有'static生存期”的需求。 我已经尽力将程序倒退,但是遇到了问题。 错误: error[E0621]: explicit lifetime required in the type o
2回复

复制一个结构以便在另一个线程上使用

我有一个结构: 我想在此结构上异步启动长操作。 我的第一次尝试是: 显然, cannot infer an appropriate lifetime due to conflicting requirements ,编译器cannot infer an appropriat
2回复

我可以安全地对不是多线程的对象进行多线程吗?

我使用的特征不是围绕多线程(Cursive)设计的。 现在,尽管它正在使用多线程,但它将位于互斥锁的后面,因此它将无法同时在两个线程中使用。 试图保护我免受腐蚀的锈病是什么,我能做些什么? 作为示例参考,我的示例代码是: 编译器抱怨thread::spawn :
2回复

如何将函数发送到另一个线程?

我正在尝试为Rust项目编写一个更简单的单元测试运行器。 我创建了一个TestFixture特性,我的测试夹具结构将实现,类似于继承其他测试框架中的单元测试基类。 特点很简单。 这是我的测试夹具 我的测试运行功能如下 我收到了错误 我尝试在发送到线程的类型周围添加A
1回复

设计帮助:在结构中进行线程化

我是Rust的新手。 作为一个学习练习,我正在尝试编写一个我曾用C ++编写的简单计时器结构。 接口和实现看起来像这样: 我理解为什么这是一个错误,因为在start函数中use of moved value: self ,但我想知道我应该如何设计我的结构,以便这样的东西可以工作。
2回复

我应该如何生成线程以进行并行计算?

今天,我进入了多线程。 由于这是一个新概念,我认为我可以通过将一个简单的迭代转换为并行化的迭代来开始学习。 但是,我想我甚至还没开始就被卡住了。 最初,我的循环看起来像这样: 我已经把相当大量的东西进入items ,花了大约0.05秒完成计算。 因此,我很高兴看到成功实现多线
1回复

与Rust中的外部进程进行多线程通信

生锈的新手。 我想启动一个外部长期运行的过程,并通过Rust中多个线程的管道与之对话。 我遇到了生命周期错误,无法找到适当的方法来取悦生命周期检查器。 有哪些重组方法? 考虑以下示例: use std::process::{Command, Stdio, ChildStdi
1回复

未来:: spawn()有点用吗? 我如何对此进行多线程处理?

摘自main在这里: 因此,基本上,我在这里所做的工作是行不通的,因为此派生调用需要传递给它的所有内容都具有静态生存期-这意味着基本上没有什么工作可以避免重复。 完全没有 无意义。 在这里进行穿线的好方法是什么?