Moe*_*ius 5 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循环扩展的扩展中注意:type必须比静态生命周期错误更长:由于先前的错误而中止
这是示例代码:
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();
}
Run Code Online (Sandbox Code Playgroud)
问题是移动到线程的每个变量都必须具有生命周期'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();
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2265 次 |
最近记录: |