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

德鲁

我有一个结构:

struct MyData {
    x: i32
}

我想在此结构上异步启动长操作。

我的第一次尝试是:

fn foo(&self) { //should return immediately
    std::thread::Thread::spawn(move || { 
        println!("{:?}",self.x); //consider a very long operation
    });
}

显然,cannot infer an appropriate lifetime due to conflicting requirements由于编译器self可能位于堆栈框架上,因此不能保证在操作在其他堆栈框架上运行时就存在该编译器

为了解决这个问题,我尝试制作一个副本self并将其提供给新线程:

fn foo(&self) { //should return immediately
    let clone = self.clone();
    std::thread::Thread::spawn(move || { 
        println!("{:?}",clone.x); //consider a very long operation
    });
}

我认为这不能编译,因为现在clone在堆栈框架上,与以前类似。我也尝试clone在线程内部进行操作,出于同样的原因,我也认为它也不能编译。

然后我决定也许可以使用achannel将复制的数据推入线程中,这一理论可能channel可以在线程之间神奇地移动(复制?)堆栈分配的数据,该示例在文档中提出但是,编译器无法为此推断寿命:

fn foo(&self) { //should return immediately
    let (tx, rx) = std::sync::mpsc::channel();
    tx.send(self.clone());
    std::thread::Thread::spawn(move || { 
        println!("{:?}",rx.recv().unwrap().x); //consider a very long operation
    });
}

最后,我决定只是将我的结构显式复制到堆上,然后将Arc传递到线程中。但即使在这里,编译器也无法确定生命周期:

fn foo(&self) { //should return immediately
    let arc = std::sync::Arc::new(self.clone());
    std::thread::Thread::spawn(move || { 
        println!("{:?}",arc.clone().x); //consider a very long operation
    });
}

好吧,借支票员,我放弃。如何将的副本复制self到新线程上?

瓦登

我认为您的问题仅仅是因为您的结构没有派生出Clone特质。您可以通过#[derive(Clone)]在结构定义之前添加来获取第二个示例进行编译和运行

我在此处的编译器行为中不了解的是.clone()它尝试在此处使用的功能。您的结构确实没有实现Clone特征,因此默认情况下不应具有.clone()功能。

围栏

您可能还需要考虑在函数中self 按value取值,并让调用者决定是应进行克隆还是仅进行移动。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何阻止一个线程修改另一个线程正在使用的数组?

来自分类Dev

我可以使用哪种Ninject绑定,以便在构造函数中将一个参数用于另一个参数?

来自分类Dev

连接两个TextField,以便在一个TextField中输入值会导致更改另一个TextField的值

来自分类Dev

android:从另一个类中的另一个线程更新UI

来自分类Dev

使对象保持活动状态,以便在python的另一个程序中使用它们

来自分类Dev

使用一个指令从另一个隔离的范围复制范围属性

来自分类Dev

使用LINQ将数据从一个表复制到另一台服务器上的另一个表?

来自分类Dev

方案结构与另一个结构

来自分类Dev

以承诺方式模拟服务,以便在另一个服务中进行测试

来自分类Dev

leveldb线程安全:读入一个线程,遍历另一个线程

来自分类Dev

复制结构的组件会删除同一结构的另一个组件

来自分类Dev

使用PIL将一个图像复制到另一个图像

来自分类Dev

使用JavaScript,以便在单击图像时更改另一个元素的位置

来自分类Dev

线程结束时从一个图片框复制到另一个图片框

来自分类Dev

在另一个类的UI线程上运行

来自分类Dev

如何建立一个可变的Vecs池,以便在Drop上重复使用?

来自分类Dev

链接相似名称类,以便在单击一个名称时给另一个名称类

来自分类Dev

我可以从一个类中获取rect.x以便在另一个类中使用吗?

来自分类Dev

Python多线程使用另一个线程中的一个线程的数据

来自分类Dev

std :: transform将一个结构数组复制到另一个

来自分类Dev

同时使用两个线程时将一个线程移动到另一个线程

来自分类Dev

从另一个线程访问一个线程上的变量-Android

来自分类Dev

将一个表复制到另一个具有不同结构的表

来自分类Dev

如何配置Nautilus,以便在插入CD / DVD / USB时不会打开另一个窗口

来自分类Dev

连接两个TextField,以便在一个TextField中输入值会导致更改另一个TextField的值

来自分类Dev

tiki-wiki:如何将一个结构复制到另一个结构或如何复制一个结构

来自分类Dev

如何创建规则,以便在收到会议请求时将其移动到另一个日历?

来自分类Dev

当另一个使用多线程完成时,启动一个方法

来自分类Dev

复制对象中的文本以在另一个对象上使用 PHP

Related 相关文章

  1. 1

    如何阻止一个线程修改另一个线程正在使用的数组?

  2. 2

    我可以使用哪种Ninject绑定,以便在构造函数中将一个参数用于另一个参数?

  3. 3

    连接两个TextField,以便在一个TextField中输入值会导致更改另一个TextField的值

  4. 4

    android:从另一个类中的另一个线程更新UI

  5. 5

    使对象保持活动状态,以便在python的另一个程序中使用它们

  6. 6

    使用一个指令从另一个隔离的范围复制范围属性

  7. 7

    使用LINQ将数据从一个表复制到另一台服务器上的另一个表?

  8. 8

    方案结构与另一个结构

  9. 9

    以承诺方式模拟服务,以便在另一个服务中进行测试

  10. 10

    leveldb线程安全:读入一个线程,遍历另一个线程

  11. 11

    复制结构的组件会删除同一结构的另一个组件

  12. 12

    使用PIL将一个图像复制到另一个图像

  13. 13

    使用JavaScript,以便在单击图像时更改另一个元素的位置

  14. 14

    线程结束时从一个图片框复制到另一个图片框

  15. 15

    在另一个类的UI线程上运行

  16. 16

    如何建立一个可变的Vecs池,以便在Drop上重复使用?

  17. 17

    链接相似名称类,以便在单击一个名称时给另一个名称类

  18. 18

    我可以从一个类中获取rect.x以便在另一个类中使用吗?

  19. 19

    Python多线程使用另一个线程中的一个线程的数据

  20. 20

    std :: transform将一个结构数组复制到另一个

  21. 21

    同时使用两个线程时将一个线程移动到另一个线程

  22. 22

    从另一个线程访问一个线程上的变量-Android

  23. 23

    将一个表复制到另一个具有不同结构的表

  24. 24

    如何配置Nautilus,以便在插入CD / DVD / USB时不会打开另一个窗口

  25. 25

    连接两个TextField,以便在一个TextField中输入值会导致更改另一个TextField的值

  26. 26

    tiki-wiki:如何将一个结构复制到另一个结构或如何复制一个结构

  27. 27

    如何创建规则,以便在收到会议请求时将其移动到另一个日历?

  28. 28

    当另一个使用多线程完成时,启动一个方法

  29. 29

    复制对象中的文本以在另一个对象上使用 PHP

热门标签

归档