我正在阅读https://doc.rust-lang.org/book/ch16-04-extensible-concurrency-sync-and-send.html
它说
换句话说,任何类型
T都是Syncif&T(对 的不可变引用T) isSend,这意味着该引用可以安全地发送到另一个线程。与 类似Send,原始类型是Sync
这怎么理解呢?如果基本类型是Sync,那么整数例如i32是Sync。因此&i32可以安全地发送到另一个线程。但我不这么认为。我认为主线程中的数字引用不能发送到另一个线程。
cdh*_*wie 10
您将线程安全的概念与生命周期的概念混淆了。
您是正确的,对所拥有的值的引用main()无法发送到生成的线程:
// No-op function that statically proves we have an &i32.
fn opaque(_: &i32) {}
fn main() {
let x = 0i32;
std::thread::spawn(|| opaque(&x)); // E0373
}
Run Code Online (Sandbox Code Playgroud)
这不会失败,因为&xis 不是Send(它是),而是因为std::thread::spawn()要求闭包是'static,并且如果它捕获对没有静态生命周期的东西的引用,则它不会失败。编译器给我们这个提示和错误:
note: function requires argument type to outlive `'static`
Run Code Online (Sandbox Code Playgroud)
我们可以通过获取具有静态生命周期()的引用&'static i32并将其发送到线程来证明这一点,这确实有效:
fn opaque(_: &i32) {}
fn main() {
static X: i32 = 0;
std::thread::spawn(|| opaque(&X));
}
Run Code Online (Sandbox Code Playgroud)