在线程中使用方法时,“类型未满足所需的生命周期”

5
我正在尝试在Rust的线程中使用一个方法,但是我收到以下错误信息:
```21:10: 21:23 error: the type [closure@<anon>:21:24: 23:14 tx:std::sync::mpsc::Sender<i32>, self:&MyStruct, adder:i32, a:i32] does not fulfill the required lifetime :21 thread::spawn(move || { ^~~~~~~~~~~~~ :18:9: 24:10 note: in this expansion of for loop expansion note: type must outlive the static lifetime error: aborting due to previous error```
下面是示例代码:
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();
}

在Rust Playground上测试它


你有没有阅读过其他出现相同(或类似)错误的问题?快速搜索发现了这个这个 - Shepmaster
1
此外,请花时间创建您问题的MCVE。这使您更容易理解问题所在,并使人们更容易回答您的问题。在这种情况下,此版本更小。 - Shepmaster
@Shepmaster,这两个链接都没有解决我的问题。 - Moebius
1个回答

9
问题在于,每个移动到线程中的变量必须具有静态生命周期。即线程不能引用不被线程拥有的值。
在这种情况下,问题在于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();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接