rust - 如何永久关闭瓶盖

标签 rust

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

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,这给我一个关于Box无法在线程之间共享的错误。实际上,一旦将fn传递给函数run,我就不在乎了,所以我想将闭包移至该函数,因为我将不再使用它。我无法将Fn标记为send,因为我实际上要传递的f没有实现Send
那么,如何才能完全移动闭合件?
//move this closure to inside of run
self.run(||{});

最佳答案

so here's what I understand of your code具有可构建的复制用例,而不是具有随机未提供的依赖关系的代码是有用的。
我得到的错误是,不能在线程之间将dyn Fn发送给,这与共享的截然不同:尽管有很多事情不能在线程之间共享(Sync)(它们只能在一个线程上使用一次)还有所有必须始终保留在其原始线程上的东西。例如,Rc并不是Send,因为它不是将线程Rc发送到另一个线程的线程安全的引用计数指针,这会破坏其保证,因此这是不允许的。dyn Fn是不透明的,除了可以被多次调用之外,不对它在内部的操作提供任何真正的保证。因此就编译器而言,它可能会关闭不是Send的内容(例如对!Sync类型或Rc的引用...),这意味着编译器会假定Fn也不是Send
解决方案很简单:只需定义f: Box<dyn Fn() + Send>,就可以在run中以这种方式保证实际上可以在线程之间发送该函数;并且run的调用者在尝试发送无法发送的函数时将收到错误消息。
demorun_ok使用一个简单的闭包,将其发送过来没有问题。 run_not_ok关闭了Rc,因此该函数无法编译(只需取消注释即可查看)。 run_ok2run_not_ok的功能相同,但使用Arc代替Rc,并且可以正常编译。

关于rust - 如何永久关闭瓶盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64151389/

相关文章:

windows - 为什么我的规范化路径的前缀是\\?\

rust - 如何在 Rust 中编写绑定(bind)到需要打开文件句柄的 C 函数?

rust - 在 rust 1.26 及以后的版本中,如何将多个字符串写入一个文件而不让它们相互覆盖?

static - 我可以避免在没有 `static mut` 的情况下重新编译我的平台层吗?

rust - std::process,带有来自缓冲区的 stdin 和 stdout

rust - 创建一个指向另一个的结构

rust - 如何将可变长度数组添加到 Vec 中?

rust - 为什么第二次要重复写 `mut`?

rust - 如何抑制测试使用的功能的 "function is never used"警告?

rust - 如何在 Unix 系统上直接执行 Rust 代码? (使用 shebang)