如何永久移动闭包

2024-04-02

我正在设计一个为我运行闭包的小结构,我可以将它们设置为停止:

pub fn run(&self, f: Box<dyn Fn()>) {
    let should_continue = self.should_continue.clone();

    self.run_thread = Some(std::thread::spawn(move || {
        while should_continue.load(Ordering::Relaxed) {
            //f should run fast so `should_continue` is readed frequently
            f();
        }
    }));
}

如你所见,我正在通过Fn在一个盒子里,这给了我一个关于盒子不能在线程之间共享的错误。实际上,一旦我将 fn 传递给这个函数,我就不关心它了run,所以我想将闭包移至此函数,因为我将不再使用它。我无法标记Fn作为发送,因为f我实际上要通过的内容并没有实现Send.

那么,如何才能完全移动闭包呢?

//move this closure to inside of run
self.run(||{});

拥有可构建的复制案例而不是具有随机未提供的依赖项的代码是有用的.

我得到的错误是dyn Fn不可能是sent线程之间的情况非常不同shared: 虽然有很多事情是做不到的shared (Sync)在线程之间(它们一次只能从一个线程使用)还有一些东西必须始终保留在其原始线程上。Rc例如,不是Send,因为它不是发送一个线程安全的引用计数指针Rc到不同的线程会破坏其保证,因此这是不允许的。

dyn Fn是不透明的,除了可多次调用之外,无法真正保证其内部正在执行的操作。因此,就编译器而言,它可能会关闭一些不存在的东西Send(例如,引用!Sync类型,或一个Rc, ...),这意味着编译器假设Fn isn't Send either.

解决方案很简单:定义f: Box<dyn Fn() + Send>,这样内run您保证该函数实际上可以在线程之间发送;和呼叫者run如果他们尝试发送无法发送的函数,则会收到错误消息。

run_ok使用一个简单的闭包,发送它没有问题。run_not_ok结束于Rc,因此该函数不会编译(只需取消注释即可查看)。run_ok2与以下函数相同run_not_ok使用一个Arc而不是Rc,并且编译良好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何永久移动闭包 的相关文章

随机推荐

  • 如何清除Java 9 JShell控制台?

    我没有找到任何清除 Java 9 JShell 控制台的命令 我也尝试通过这个程序清除JShell控制台 但它也不起作用 import java io IOException class CLS public static void mai
  • Android - 如何从 kotlin 流中读取值?

    我有来自房间数据库的剧集流程 我可以毫无问题地观察该流程的实时数据 但我还想在用户单击按钮时读取此流程中的最后一个值 我尝试使用first 终端流运算符 但它无法编译 您能帮忙或提出其他建议吗 非编译尝试从流中读取 bd buttonNex
  • 将上下文传递给自定义挂钩或在自定义挂钩内调用 useContext 更好吗?

    我有越来越多的自定义挂钩 其中许多通过以下方式访问相同的反应上下文useContext钩 在许多组件中 需要使用多个自定义挂钩 打电话比较好吗useContext每个组件一次并将上下文传递到我的自定义挂钩中 还是最好调用useContext
  • 如何删除/取消注册 GitLab 运行程序

    几个月前我注册了一个个人 GitLab 运行器 但我不再使用它 如何完全删除它 使其不会显示在我的 GitLab CI CD 设置页面上 列出跑步者以获取他们的令牌和 URL sudo gitlab runner list 使用指定运行者令
  • Android 10.0 应用程序在 BOOT 上启动

    我们有一个 Android 应用程序 我们打算在手机启动期间启动 启动 通过在 Android 10 中尝试一些代码 我们意识到在 Android 8 0 之后无法在启动时启动应用程序 以前在 Android 6 中 这是可能的 即使在物理
  • Heroku Dynos 是否享受 AWS 网络内的免费数据传输?

    我正在考虑将 Heroku 用于 NodeJS 应用程序 我想知道他们的 Dynos 是否享受 AWS 网络内的免费内部数据传输 我想使用 DynamoDB ElastiCache RDS SQS 和许多其他 AWS 产品 如果我可以从 H
  • 如何使用 OpenXML 查找段落中的页码?

    For a 段落对象 如何使用 Open XML SDK 2 0 for Microsoft Office 确定该对象位于哪个页面 使用以下方法无法获取 Word 文档的页码OpanXml Sdk因为这是由客户端处理的 例如 MS Word
  • 推送 UIView 时隐藏 UITabBar

    我有一个UITabBarController其中默认视图控制器是UINavigationController 当我在视图中推送某个视图时 我希望能够隐藏 UITabBarController 的 UITabBarUINavigationCo
  • 如何获取任务的结果或返回值?

    有人可以向我解释如何返回任务的结果吗 我目前正在尝试执行以下操作 但我的任务没有返回我期望的列表 这里有什么问题 static void Main List
  • 无法读取 null 的属性“props” - Reactjs [重复]

    这个问题在这里已经有答案了 基本上我想在子组件中调用父组件的函数 该函数将更改父组件的状态 我在父组件中创建了一个处理程序并将其作为道具传递给子组件 现在我想在子组件中调用它 Parent state formstep 1 construc
  • 如何覆盖 laravel 资源路由默认方法?

    我的 REST API url 具有以下架构 Verb Url Method GET tasks findAll GET tasks id findOne POST tasks create PUT tasks id update DELE
  • 读取行期间的 Source.fromInputStream 异常处理

    我创建了一个函数 其中接受输入流作为参数并返回由字符串组成的迭代器 我按如下方式完成此操作 def lineEntry fileInputStream InputStream Iterator String Source fromInput
  • Common Lisp 中的(随机)不那么随机?

    好的 最后一个问题 我将用 Common Lisp 完成我的猜数游戏 D 每当游戏开始 或者在第一个游戏之后开始新游戏 时 都会调用以下函数 Play the game defun play If it s their first time
  • Symfony v4、php bin/console 无法按预期工作。自动中止[重复]

    这个问题在这里已经有答案了 我刚刚在我的新 SSD 上安装了 Composer php apache 等 之后我想开始编码 我从 IDE 中的另一个驱动器打开了我的项目 然后我想将我的灯具加载到我的新数据库中 但我不能 我什至无法进行迁移等
  • 如何使用 Selenium 和 Python 单击文本为(全选)的下拉项

    编辑 关于这个page https i stack imgur com mdjih png 我正在尝试提交从数据库生成的报告的参数 我已经能够为 send keys 发送第一个字段的新开始日期 第二个字段 结束日期 保持不变 对于第三个字段
  • 如何重新创建与默认 tableView:viewForHeaderInSection: 相同的默认 UIView?

    我尝试实施 UIView tableView UITableView tableView viewForHeaderInSection NSInteger section 获取标题部分的文本标签为黑色而不是白色 但它看起来与SDK创建的默认
  • Oracle 即时客户端:ORA-28759:无法打开文件

    我拥有 red hat 6 服务器 具有 TCPS 连接设置的远程 Oracle 数据库 从 rpm 安装的 oracle 即时客户端 basic odbc sqlplus 我正在尝试设置 Oracle 即时客户端来连接到远程数据库 输入命
  • Django REST 框架中的 405“不允许方法 POST”

    我正在使用 Django REST 框架来实现 Get Post api 方法 并且 GET 可以正常工作 但是 当发送 post 请求时 会显示下面的 405 错误 我在这里缺少什么 405 Method Not Allowed deta
  • 如何在使用 oauthlib.oauth2 fetch_token 时捕获 API 失败

    Python3fetch token该库中的方法在使用响应之前不会检查响应状态 如果它进行的 API 调用失败 则响应将无效并且脚本崩溃 我是否可以设置一些内容 以便在库读取响应之前在不成功的响应上引发异常 import requests
  • 如何永久移动闭包

    我正在设计一个为我运行闭包的小结构 我可以将它们设置为停止 pub fn run self f Box