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/