为什么是&mut发送?线程如何在安全的 Rust 中捕获 &mut?

JMC*_*JMC 5 multithreading thread-safety rust

语言文档指出:

&mut TSend当且仅当TSend

有人可以提供一个代码示例来说明这实际上是相关的吗? thread::spawn要求其闭包在生命周期内借用'static,因此线程闭包只能借用静态变量,但安全 Rust 不允许static mut。因此,无论如何都不应该捕获线程闭包中的任何内容&mut

&muta的能力在哪些用例中Send具有相关性?

kmd*_*eko 5

A原则上&mut T应该是(如果是);不应仅仅因为无法为其构建安全用例而忽略该实现(由于某种原因仍然存在)。SendTSendunsafe

但有一些安全的用例:

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

  • 它不是unsafe使用 a&'static mut T也不static mut是创建 a 的唯一方法。Box::leak可以通过使用例如来安全地完成。这显然应该可以发送到另一个线程。

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