语言文档中提到:
&mut T
只有当T
是Send
时,&mut T
才是Send
有人能提供一个实际相关的代码示例吗?
thread::spawn
要求其闭包借用 'static
生命周期,因此只有静态变量可以被线程闭包借用,但是安全的 Rust 不允许使用 static mut
。因此,不可能通过 &mut
在线程闭包中捕获任何东西。
在哪种情况下,&mut
的 Send
能力才会有关?
语言文档中提到:
&mut T
只有当T
是Send
时,&mut T
才是Send
有人能提供一个实际相关的代码示例吗?
thread::spawn
要求其闭包借用 'static
生命周期,因此只有静态变量可以被线程闭包借用,但是安全的 Rust 不允许使用 static mut
。因此,不可能通过 &mut
在线程闭包中捕获任何东西。
在哪种情况下,&mut
的 Send
能力才会有关?
&mut T
应该原则上是 Send
的(如果 T
是 Send
的);实现不应该被忽视,仅仅因为你无法构造一个安全的用例(unsafe
仍然存在有其原因)。std::thread::scope
提供了一种在其他线程中执行代码并允许访问局部变量的方法。在链接的文档中,另一个线程中使用了 &mut i32
,因此需要 Send
。
使用 &'static mut T
并不是 unsafe
的,而且 static mut
不是创建它的唯一方式。例如,可以安全地使用 Box::leak
来完成。这显然是可行的,可以将其发送到另一个线程。
async
任务可能希望在跨越 .await
点时保持内部可变引用,并因此需要 &mut T
实现 Send
。当编写 async
函数时,无论你是否意识到,这都是非常简单的。