395 字
2 分钟
Rust Send / Sync
Send
Send 表示一个类型的值可以安全地在线程之间传递。当一个类型实现了 Send trait 时,这意味着该类型的所有权可以安全地从一个线程转移到另一个线程。标准库中的大多数类型都实现了 Send,包括原生类型(如 i32、f64 等)和标准库提供的容器(如 Vec<T>、Option<T> 等),但一些类型(如 Rc<T>)由于其内部的非线程安全特性并没有实现 Send。
Sync
Sync 也是一个标记 trait,表示一个类型的引用可以安全地在多个线程之间共享。如果一个类型 T 是 Sync 的,那么 &T 是 Send 的,即类型的共享引用可以在线程之间传递。换句话说,如果一个类型是 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类型默认实现了Send和Sync。Mutex<T>也是Send和Sync的,只要T是Send和Sync的。Arc<T>是一个原子引用计数智能指针,它实现了Send和Sync,只要T是Send和Sync。
Rust Send / Sync
https://blog.lpkt.cn/posts/rust-send-sync/