"该类型不能满足所需的寿命"在线程中使用方法时

时间:2015-10-30 17:51:49

标签: multithreading rust

我正在尝试在Rust中的一个线程中使用一个方法,但是我收到以下错误消息

  

:21:10:21:23错误:类型[closure@<anon>:21:24: 23:14 tx:std::sync::mpsc::Sender<i32>, self:&MyStruct, adder:i32, a:i32]   不符合要求的寿命:21
  thread :: spawn(move || {                         ^ ~~~~~~~~~~~~:18:9:24:10注意:在这个for循环扩展的扩展注意:类型必须比静态更长   生命周期错误:由于先前的错误而中止

这是示例代码:

use std::thread;
use std::sync::mpsc;

struct MyStruct {
    field: i32
}

impl MyStruct {
    fn my_fn(&self, adder1: i32, adder2: i32) -> i32 {
        self.field + adder1 + adder2
    }

    fn threade_test(&self) {
        let (tx, rx) = mpsc::channel();
        let adder = 1;
        let lst_adder = vec!(2, 2, 2);

        for a in lst_adder {
            let tx = tx.clone();

            thread::spawn(move || {
                let _ = tx.send(self.my_fn(adder, a));
            });
        }

        println!("{}", rx.recv().unwrap());
    }
}

fn main() {
    let ms = MyStruct{field: 42};
    ms.threade_test();
}

Test it on the Rust Playground

1 个答案:

答案 0 :(得分:7)

问题是移动到线程的每个变量都必须具有生命周期'static。即线程不能引用不属于该线程的值。

在这种情况下,问题是self是对MyStruct实例的引用。

要解决此问题,请删除每个引用并克隆结构,然后再将其发送到线程。

use std::thread;
use std::sync::mpsc;

#[derive(Clone)]
struct MyStruct {
    field: i32
}

impl MyStruct {
    fn my_fn(&self, adder1: i32, adder2: i32) -> i32 {
        self.field + adder1 + adder2
    }

    fn threade_test(&self) {
        let (tx, rx) = mpsc::channel();
        let adder = 1;
        let lst_adder = vec!(2, 2, 2);

        for a in lst_adder {
            let tx = tx.clone();

            let self_clone = self.clone();
            thread::spawn(move || {
                let _ = tx.send(self_clone.my_fn(adder, a));
            });
        }

        println!("{}", rx.recv().unwrap());
    }
}

fn main() {
    let ms = MyStruct{field: 42};
    ms.threade_test();
}