下面的代码,set_cb(func);会报错,如何包装能够做到这样的效果:
fn set_cb(handler: F)
{
handler();
}
fn main() {
let join_handle = std::thread::spawn(|| {});
let func = || {
join_handle.join().unwrap();
};
set_cb(func);
// func();
}
代码中的问题是你试图在闭包中捕获 join_handle,但 std::thread::JoinHandle 不满足 Fn trait,因为它不是 Clone 和 Copy。这就是为什么你不能直接捕获它并在闭包中使用。解决方法是使用 Arc
这是一个修改后的例子:
use std::sync::{Arc, Mutex};
use std::thread;
fn set_cb(handler: F)
{
handler();
}
fn main() {
let join_handle = Arc::new(Mutex::new(Some(thread::spawn(|| {}))));
let join_handle_clone = Arc::clone(&join_handle);
let func = move || {
let mut join_handle = join_handle_clone.lock().unwrap();
join_handle.take().unwrap().join().unwrap();
};
set_cb(func);
}
在这个修改后的例子中,我们创建了一个 Arc