use std::sync::{Arc, Mutex};
use std::thread;
// 定义结构体
struct MyStruct {
a: i32,
b: i32,
c: i32,
}
fn main() {
let my_struct = MyStruct { a: 1, b: 2, c: 3 };
// 使用Arc和Mutex来保证线程安全
let arc_my_struct = Arc::new(Mutex::new(my_struct));
// 克隆Arc以便传递给子线程
let arc_my_struct_clone1 = arc_my_struct.clone();
let handle1 = thread::spawn(move || {
let mut my_struct = arc_my_struct_clone1.lock().unwrap();
// 处理a成员变量
my_struct.a = my_struct.a * 2;
});
let arc_my_struct_clone2 = arc_my_struct.clone();
let handle2 = thread::spawn(move || {
let mut my_struct = arc_my_struct_clone2.lock().unwrap();
// 处理b成员变量
my_struct.b = my_struct.b + 5;
});
// 等待子线程结束
handle1.join().unwrap();
handle2.join().unwrap();
// 主线程继续使用MyStruct的剩余部分
let my_struct = arc_my_struct.lock().unwrap();
println!("c: {}", my_struct.c);
}
生命周期标注说明
- Rust中的所有权和生命周期:Rust通过所有权系统来管理内存,每个值都有一个所有者,当所有者离开作用域时,值会被销毁。生命周期标注主要用于确保引用的有效性,即引用的生命周期不会超过它所引用的值的生命周期。
- 线程安全方面:
- 在这个例子中,我们使用
Arc
(原子引用计数)来允许在多个线程间共享数据。Arc
内部使用原子操作来管理引用计数,确保在多线程环境下引用计数的增减是线程安全的。
Mutex
(互斥锁)用于保护共享数据,确保同一时间只有一个线程可以访问数据。当一个线程通过lock
方法获取锁时,其他线程必须等待,这样就避免了数据竞争。
- 生命周期标注:
- 在这个场景中,由于
MyStruct
通过Arc
在不同线程间共享,Arc
的生命周期会自动管理,使得只要有线程在使用MyStruct
,它就不会被销毁。Mutex
内部的MyStruct
通过lock
方法返回的MutexGuard
来保证在锁持有期间MyStruct
的安全访问。MutexGuard
的生命周期与锁的持有时间相同,当MutexGuard
离开作用域时,锁会自动释放。
- 对于线程间传递数据,
move
语义确保每个子线程获得数据的所有权,在子线程结束前数据不会被主线程意外销毁。同时,通过Arc
和Mutex
的组合,主线程在子线程结束后仍然可以安全地访问MyStruct
的剩余部分。