当前位置: 首页 > news >正文

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,而无需担心所有权问题。

http://www.lryc.cn/news/193575.html

相关文章:

  • 【JUC】线程通信与等待唤醒机制
  • C#面对对象(英雄联盟人物管理系统)
  • 2023年中国分布式光纤传感产量、需求量及行业市场规模分析[图]
  • B2R Raven: 2靶机渗透
  • SpringBoot-黑马程序员-学习笔记(六)
  • unity2022版本 实现手机虚拟操作杆
  • 『GitHub Actions』部署静态博客指南
  • WPF Datagrid Header数据绑定,表头复选框实现全选、全否、部分选中,根据条目动态变化
  • Tensorflow2 中对模型进行编译,不同loss函数的选择下输入数据格式需求变化
  • 【python】基础语法(三)--异常、模块、包
  • XGBoost+LR融合
  • leetcode:1929. 数组串联(python3解法)
  • Epoch和episodes的区别
  • 漏洞复现--华测监测预警系统2.2任意文件读取
  • 数据结构 - 6(优先级队列(堆)13000字详解)
  • Js高级技巧—拖放
  • ELF和静态链接:为什么程序无法同时在Linux和Windows下运行?
  • 【爬虫实战】python微博热搜榜Top50
  • 【网络基础】——传输层
  • 删除字符串特定的字符(fF)C语言
  • C++入门(1):命名空间,IO流 输入输出,缺省参数
  • Go 语言面试题(三):并发编程
  • Linux - make命令 和 makefile
  • FPGA复习(功耗)
  • element ui el-table表格复选框,弹框关闭取消打勾选择
  • 数据结构——队列
  • 【Unity引擎核心-Object,序列化,资产管理,内存管理】
  • Generics/泛型, ViewBuilder/视图构造器 的使用
  • 数据结构之手撕顺序表(增删查改等)
  • 进阶JAVA篇- ZoneId 类与 ZoneDateTime 类、Instant类的常用API(七)