395 字
2 分钟
Rust Send / Sync
2024-07-17

Send#

Send 表示一个类型的值可以安全地在线程之间传递。当一个类型实现了 Send trait 时,这意味着该类型的所有权可以安全地从一个线程转移到另一个线程。标准库中的大多数类型都实现了 Send,包括原生类型(如 i32f64 等)和标准库提供的容器(如 Vec<T>Option<T> 等),但一些类型(如 Rc<T>)由于其内部的非线程安全特性并没有实现 Send

Sync#

Sync 也是一个标记 trait,表示一个类型的引用可以安全地在多个线程之间共享。如果一个类型 TSync 的,那么 &TSend 的,即类型的共享引用可以在线程之间传递。换句话说,如果一个类型是 Sync 的,多个线程可以安全地引用它。这通常用于不可变的数据或通过同步原语(如互斥锁)保护的可变数据。标准库中的大多数类型也实现了 Sync

示例#

use std::sync::{Arc, Mutex};
use std::thread;

fn main() {
    // 是 Send 和 Sync
    let x = 5;

    // 创建一个原子引用计数的智能指针
    let data = Arc::new(Mutex::new(x));

    let mut handles = vec![];

    for _ in 0..10 {
        let data = Arc::clone(&data);
        let handle = thread::spawn(move || {
            let mut num = data.lock().unwrap();
            *num += 1;
        });
        handles.push(handle);
    }

    for handle in handles {
        handle.join().unwrap();
    }

    println!("Result: {}", *data.lock().unwrap());
}

在这个例子中:

  • i32 类型默认实现了 SendSync
  • Mutex<T> 也是 SendSync 的,只要 TSendSync 的。
  • Arc<T> 是一个原子引用计数智能指针,它实现了 SendSync,只要 TSendSync
Rust Send / Sync
https://blog.lpkt.cn/posts/rust-send-sync/
作者
lollipopkit
发布于
2024-07-17
许可协议
CC BY-NC-SA 4.0