如何理解 Rust 中的“原始类型是同步的”?

sgo*_*n00 2 rust

我正在阅读https://doc.rust-lang.org/book/ch16-04-extensible-concurrency-sync-and-send.html

它说

换句话说,任何类型T都是Syncif &T(对 的不可变引用T) is Send,这意味着该引用可以安全地发送到另一个线程。与 类似Send,原始类型是Sync

这怎么理解呢?如果基本类型是Sync,那么整数例如i32Sync。因此&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)