use std::thread;
// 定义一个结构体
struct Data {
value: i32,
}
// 定义一个函数,接受一个Data的引用并进行操作
fn operate_on_data(data: &mut Data) {
data.value += 1;
}
fn main() {
let mut data = Data { value: 0 };
// 使用move闭包来转移所有权,确保线程安全
let handle = thread::spawn(move || {
// 这里使用函数指针调用函数
let func_ptr: fn(&mut Data) = operate_on_data;
func_ptr(&mut data);
});
// 等待线程结束
handle.join().unwrap();
println!("Final value: {}", data.value);
}
代码解释
- 所有权:通过
move
关键字将data
的所有权转移到新线程的闭包中。这样,data
在主线程中不再可用,避免了主线程和新线程同时访问data
导致的数据竞争。
- 借用规则:在新线程内部,通过可变借用
&mut Data
来操作data
。Rust的借用规则确保在同一时间只有一个可变引用,从而防止数据竞争。
- 函数指针:定义了一个函数指针
func_ptr
指向operate_on_data
函数,通过函数指针调用函数来对data
进行操作,展示了如何在这种场景下使用函数指针。这样,在新线程中结合引用(&mut Data
)与函数指针(fn(&mut Data)
)进行操作,同时保证了线程安全并避免了数据竞争。