为什么&mut Send?在安全的Rust中,线程如何捕获&mut?

5

语言文档中提到:

&mut T 只有当 TSend 时,&mut T 才是 Send

有人能提供一个实际相关的代码示例吗? thread::spawn 要求其闭包借用 'static 生命周期,因此只有静态变量可以被线程闭包借用,但是安全的 Rust 不允许使用 static mut。因此,不可能通过 &mut 在线程闭包中捕获任何东西。

在哪种情况下,&mutSend 能力才会有关?

1个回答

5
一个 &mut T 应该原则上是 Send 的(如果 TSend 的);实现不应该被忽视,仅仅因为你无法构造一个安全的用例(unsafe 仍然存在有其原因)。
但是也有安全的用例:
  • std::thread::scope 提供了一种在其他线程中执行代码并允许访问局部变量的方法。在链接的文档中,另一个线程中使用了 &mut i32,因此需要 Send

  • 使用 &'static mut T 并不是 unsafe 的,而且 static mut 不是创建它的唯一方式。例如,可以安全地使用 Box::leak 来完成。这显然是可行的,可以将其发送到另一个线程。

  • async 任务可能希望在跨越 .await 点时保持内部可变引用,并因此需要 &mut T 实现 Send。当编写 async 函数时,无论你是否意识到,这都是非常简单的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接