< 返回版块

ankoGo 发表于 2024-03-17 12:16

use std::thread;

// 定义一个可以被多线程安全共享的结构体
#[derive(Debug)]
struct SharedData {
    value: i32,
}

// 打印结构体内容的函数,它接受一个Arc<Mutex<SharedData>>类型的参数
fn print_data(data: Arc<Mutex<SharedData>>) {
    // 获取互斥锁的锁定状态,这里使用unwrap处理可能的Err
    // 在实际应用中,应该更优雅地处理这种错误
    let locked_data = data.lock().unwrap(); // 获取锁
    // 打印结构体的内容
    println!("{:?}", locked_data); // 打印数据
}

fn main() {
    // 创建一个Arc包装的Mutex,用于在多个线程之间共享数据
    let shared_data = Arc::new(Mutex::new(SharedData { value: 42 }));

    // 创建多个线程,并将Arc的克隆传递给每个线程
    let handle1 = thread::spawn(move || {
        // 在这里,我们创建了一个新的Arc克隆
        let data_clone = Arc::clone(&shared_data);
        print_data(data_clone);
    });

    let handle2 = thread::spawn(move || {
        // 在这里,我们又创建了一个新的Arc克隆
        let data_clone = Arc::clone(&shared_data);
        print_data(data_clone);
    });

    // 等待线程完成
    handle1.join().unwrap();
    handle2.join().unwrap();
}

这段代码有错误,我该如何修复他?


use of moved value: `shared_data` [E0382] value used here after move

评论区

写评论
作者 ankoGo 2024-03-17 13:34

非常感谢你

dakai-chen 2024-03-17 12:44
use std::sync::{Arc, Mutex};
use std::thread;

// 定义一个可以被多线程安全共享的结构体
#[derive(Debug)]
struct SharedData {
    value: i32,
}

// 打印结构体内容的函数,它接受一个Arc<Mutex<SharedData>>类型的参数
fn print_data(data: Arc<Mutex<SharedData>>) {
    // 获取互斥锁的锁定状态,这里使用unwrap处理可能的Err
    // 在实际应用中,应该更优雅地处理这种错误
    let locked_data = data.lock().unwrap(); // 获取锁
                                            // 打印结构体的内容
    println!("{:?}", locked_data); // 打印数据
}

fn main() {
    // 创建一个Arc包装的Mutex,用于在多个线程之间共享数据
    let shared_data = Arc::new(Mutex::new(SharedData { value: 42 }));
    let data_clone = Arc::clone(&shared_data);

    // 捕获 data_clone
    let handle1 = thread::spawn(move || {
        print_data(data_clone);
    });

    // 捕获 shared_data
    let handle2 = thread::spawn(move || {
        print_data(shared_data);
    });

    // 等待线程完成
    handle1.join().unwrap();
    handle2.join().unwrap();
}
liming01 2024-03-17 12:40

传给move的闭包之前,就先调用Arc::clone(),具体的看例子:

https://doc.rust-lang.org/std/sync/struct.Arc.html#examples

1 共 3 条评论, 1 页