< 返回版块

ankoGo 发表于 2024-03-17 14:25

use std::thread;

#[derive(Debug)]
struct Parent {
    id: i32,
    child: Option<Arc<Mutex<Child>>>,
}

impl Parent {
    pub fn get_value(&self) {
        println!("{}", self.id);
    }

    pub fn set_child(&mut self, child: Arc<Mutex<Child>>) {
        self.child = Some(child);
    }

    pub fn run(&self) {
        println!("run");
        if let Some(child_ref) = self.child.as_ref() {
            let child = child_ref.lock().unwrap(); // 使用lock来获取Mutex的互斥锁
            child.call_parent(self);
        }
    }
}

#[derive(Debug)]
struct Child {
    parent: Option<Arc<Mutex<Parent>>>,
}

impl Child {
    pub fn call_parent(&self, parent: &Parent) {
        parent.get_value();
    }
}

fn main() {
    println!("Hello, world!");
    let parent = Arc::new(Mutex::new(Parent { id: 123, child: None }));
    //如果注释掉这里会死锁,为什么?
    // {
        let child = Child { parent: Some(Arc::clone(&parent)) };
        let mut p = parent.lock().unwrap(); // 获取Parent的Mutex锁
        p.set_child(Arc::new(Mutex::new(child))); // 设置child
        p.run(); // 运行Parent的run方法
        //或者用这种方式来释放锁?测试也是可以的
        // drop(p); // 释放Parent的Mutex锁
    // }
    
    let parent_clone1=Arc::clone(&parent);
    let parent_clone2=Arc::clone(&parent);

    let thread1 = thread::spawn(move || {
        println!("{:?}", "thread1");
        let  p1 = parent_clone1.lock().unwrap(); // 获取Parent的Mutex锁
        println!("{:?}", p1);
    });
    let thread2 = thread::spawn(move || {
        println!("{:?}", "thread2");
        let  p2 = parent_clone2.lock().unwrap(); // 获取Parent的Mutex锁
        println!("{:?}", p2);
    });

    thread1.join().expect("thread1 Couldn't join on the associated thread");
    thread2.join().expect("thread2 Couldn't join on the associated thread");
    // println!("{:?}", child);
}```


问题在代码中,麻烦细看

评论区

写评论
作者 ankoGo 2024-03-22 10:37

实在太丑,丑到我以为回到了2000年

--
👇
asuper: 几个月以前,我也提过建议,站长说是在开发新版,这个版本大概率是不会改动了

--
👇
AnkoGo123: 感觉这个论坛的帖子层级不大好友,希望可以改进下

asuper 2024-03-19 09:27

几个月以前,我也提过建议,站长说是在开发新版,这个版本大概率是不会改动了

--
👇
AnkoGo123: 感觉这个论坛的帖子层级不大好友,希望可以改进下

作者 ankoGo 2024-03-17 14:41

感觉这个论坛的帖子层级不大好友,希望可以改进下

作者 ankoGo 2024-03-17 14:40

好的,非常感谢,初学,有点难,多谢大佬帮助解惑

--
👇
dakai-chen: 使用 {} 限制作用域,或者使用drop提前释放都是可以的。

dakai-chen 2024-03-17 14:36

使用 {} 限制作用域,或者使用drop提前释放都是可以的。

作者 ankoGo 2024-03-17 14:34

明白了,所以正常写代码中,我们该如何释放锁呢?一般

--
👇
dakai-chen: p是锁的守卫,释放p将归还锁。此代码中p将一直生存到主线程结束,所以子线程无法获得锁。

dakai-chen 2024-03-17 14:31

p是锁的守卫,释放p将归还锁。此代码中p将一直生存到主线程结束,所以子线程无法获得锁。

1 共 7 条评论, 1 页