《语言docs》规定:

&mut TSend当且仅当TSend

谁能提供一个代码示例,说明这实际上是相关的? thread::spawn要求它的闭包borrow 'static的生存期,因此只有静态机可以通过线程闭包borrow ,但Safe Rust不允许static mut.因此,无论如何都不可能在&mut之前捕获线程闭包中的任何内容.

在哪个用例中,&mut‘S Send能力可以是相关的?

推荐答案

&mut T原则上应该是Send(如果TSend);不应该仅仅因为您不能为它构建安全的用例(unsafe仍然存在是有原因的)而忽视实现.

但也有一些安全的使用 case :

  • std::thread::scope提供了一种在允许访问局部变量的同时在其他线程中执行代码的方法.在链接的文档中,&mut i32在另一个线程中使用,因此需要Send.

  • 使用&'static mut T不是unsafe,static mut也不是创建&'static mut T的唯一方法.例如,使用Box::leak可以安全地完成这项工作.这显然可以发送到另一个线程.

  • async个任务可能希望成为Send,同时在.await个点上保持内部可变引用,因此需要&mut T来实现Send.在编写async个函数时,无论您是否意识到这一点,这都是微不足道的.

Rust相关问答推荐

为什么在Rust struct 中只允许最后一个字段具有动态大小的类型

如何从使用mockall模拟的方法中返回self?

MacOS(AARCH64)上Ghidra中的二进制补丁导致进程终止

为什么`Vec i64`的和不知道是`Option i64`?

为什么std repeat trait绑定在impl块和关联函数之间?

异步FN中的 rust 递归

取得本地对象字段的所有权

如何将映射反序列化为具有与键匹配的字段的定制 struct 的向量?

如何在Rust中缩短数组

处理带有panic 的 Err 时,匹配臂具有不兼容的类型

Windows 上 ndarray-linalg 与 mkl-stats 的链接时间错误

这个不安全的 Rust 代码有什么问题,所以它可以在 Windows 上运行,但不能在 Ubuntu 上运行?

提取指向特征函数的原始指针

sha256 摘要仅适用于 &*

为什么我们有两种方法来包含 serde_derive?

当锁被释放时,将锁包装到作用域中是否会发生变化?

为什么数组不像向量那样在 for 块之后移动?

为什么 no_std crate 可以依赖于使用 std 的 crate?

如何异步记忆选项中的 struct 字段

为什么一个整型变量赋值给另一个变量后仍然可以使用?