Rust中FnOnce如何传递给一个约束Fn的回调

Rust中FnOnce如何传递给一个约束Fn的回调

下面的代码,set_cb(func);会报错,如何包装能够做到这样的效果:

复制代码
fn set_cb<F: Fn() + 'static>(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<Mutex<...>> 来共享 JoinHandle。

这是一个修改后的例子:

复制代码
use std::sync::{Arc, Mutex};
use std::thread;

fn set_cb<F: Fn() + Send + 'static>(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<Mutex<Option>>。我们创建一个 Option,这样我们就可以在闭包中使用 take() 方法将其设置为 None,这样就可以将其移动出 Mutex,而无需在闭包中保持锁定。这样,我们就可以在 set_cb 调用中使用 join_handle,而无需担心所有权问题。

相关推荐
Cyclic10012 小时前
IOS购买订阅通知信息解析说明Java
java·开发语言·ios
AI视觉网奇2 小时前
麒麟系统播放图片 速度比较
开发语言·python·pygame
晨曦5432102 小时前
图(Graph):关系网络的数学抽象
开发语言·算法·php
Ustinian_3103 小时前
【C/C++】For 循环展开与性能优化【附代码讲解】
c语言·开发语言·c++
牵牛老人3 小时前
Qt 插件开发全解析:从接口定义,插件封装,插件调用到插件间的通信
开发语言·qt
钮钴禄·爱因斯晨3 小时前
AIGC浪潮下,风靡全球的Mcp到底是什么?一文讲懂,技术小白都知道!!
开发语言·人工智能·深度学习·神经网络·生成对抗网络·aigc
22jimmy4 小时前
JavaWeb(二)CSS
java·开发语言·前端·css·入门·基础
机器视觉知识推荐、就业指导6 小时前
面试问题详解五:Qt 信号与槽的动态管理
开发语言·qt
四维碎片12 小时前
【Qt】线程池与全局信号实现异步协作
开发语言·qt·ui·visual studio
IT码农-爱吃辣条12 小时前
Three.js 初级教程大全
开发语言·javascript·three.js