【发布时间】:2016-02-13 05:25:08
【问题描述】:
我试图弄清楚如何通过通道发送函数,以及如何避免额外的克隆以便在另一端执行函数。如果我删除闭包内的额外克隆操作,我会收到以下错误:
error: cannot move out of captured outer variable in an 'Fn' closure
忽略此代码完全不执行任何操作并使用全局可变静态Sender<T> 的事实,它代表了我在给出适当的编译器错误时试图实现的目标。这段代码不打算运行,只是编译。
use std::ops::DerefMut;
use std::sync::{Arc, Mutex};
use std::collections::LinkedList;
use std::sync::mpsc::{Sender, Receiver};
type SafeList = Arc<Mutex<LinkedList<u8>>>;
type SendableFn = Arc<Mutex<(Fn() + Send + Sync + 'static)>>;
static mut tx: *mut Sender<SendableFn> = 0 as *mut Sender<SendableFn>;
fn main() {
let list: SafeList = Arc::new(Mutex::new(LinkedList::new()));
loop {
let t_list = list.clone();
run(move || {
foo(t_list.clone());
});
}
}
fn run<T: Fn() + Send + Sync + 'static>(task: T) {
unsafe {
let _ = (*tx).send(Arc::new(Mutex::new(task)));
}
}
#[allow(dead_code)]
fn execute(rx: Receiver<SendableFn>) {
for t in rx.iter() {
let mut guard = t.lock().unwrap();
let task = guard.deref_mut();
task();
}
}
#[allow(unused_variables)]
fn foo(list: SafeList) { }
有没有更好的方法来解决这个错误和/或我应该通过通道发送函数的另一种方法?
【问题讨论】:
标签: rust function-pointers channel